При сопоставлении строки с регулярным выражением, двигатель будет пытаться выполнять все позиции слева направо, пока не будет найдено совпадение.
Поскольку строка отсканирована слева направо, (?:/)(.*?)(?:/)$
может найти соответствие по индексу 0 входной строки /1000/2000/
.
Леновый квантификатор влияет только на порядок повторения попыток. Он попробует пустую строку, а затем повторит один, два, три раза и т. Д. Так как .
соответствует чему-либо, кроме терминаторов строк, и строка проверяется слева направо, сопоставляется целое /1000/2000/
.
Кстати, в то время как это обычно говорит, что .*?
соответствует наименьшее количество символов возможно, правильное определение, что ленивый квантор будет пытаться расширить атом (в данном случае .
) наименьшее число возможно, так что сиквел (в данном случае (?:/)$
) может быть сопоставлен.
Решение, как уже упоминалось в других ответов, чтобы ограничить набор допустимых символов между ними /
путем замены .
с [^/]
. После изменения класса символа вы можете использовать либо жадный, либо ленивый квантификатор, поскольку грамматика стала однозначной, поэтому порядок поиска не влияет на конечный результат.
Это не похоже на содержательное соответствие, что вы на самом деле пытаетесь сделать? Или вам просто интересно, почему шаблон соответствует тому, как он работает? –
@ Mike'Pomax'Kamermans Я пытаюсь получить последнее 'something' между'/', прямо перед концом строки. – alexandernst
правильно, но это сильно звучит как проблема [XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem), где вы спрашиваете «что-то, между косой чертой », но только потому, что у вас есть проблема, и вы подумали о решении и о том, как вы пытаетесь получить помощь с этим решением, а не с исходной проблемой. –