2015-04-29 3 views
-1

Следуя моим рассуждениям, оно должно соответствовать пробелу> любым символам перед концом строки, а ? делает он ленив, то есть abc)? самый лучший матч.

Почему я делаю неправильно? не должно соответствовать abc)?

+0

Строка по-прежнему оценивается слева направо. Итак, матч начинается с первого места. Ленивый не обязательно означает кратчайший. –

+2

Он находит первое место, а затем все после этого матча. Если вы хотите получить все после последнего пробела, вы должны использовать '/ (\ S *?) $ /' – RevanProdigalKnight

ответ

1

он найдет первое место, а затем все остальное до конца строки.

Из-за заказа, это получит первый (космос) th en your (.*?) будет соответствовать всем до конца строки $. Это выполняется слева направо.

Если вы действительно хотите сопоставить что-либо после последнего пробела, как указано @RevanProdigalKnight, вам нужно убедиться, что оно соответствует пробелу, а затем все, что не является пространством до конца строки. Я предлагаю следующее регулярное выражение:

/\s\S*$/ 
+0

так, "?" ничего не делает? – Kryoschdrmurgjencsen

+0

'*?' Это квантификатор, и он будет равен нулю до неограниченного времени, как можно меньше, расширяя по мере необходимости. Точка '.' соответствует также пробелам. –

+0

@Kryoschdrmurgjencsen: Да, '?' Не имеет никакого эффекта. Создание квантификатора ленивое/неохотное/нежелюстное влияет только на то, где совпадение * заканчивается *, а не там, где оно начинается. '' 'Делает это несущественным в этом случае, поскольку он может соответствовать только концу строки (оставляя в стороне отвлечение режимов Multiline и Singleline/DOTALL). –

1

Ваше регулярное выражение:

(.*?)$ 

или сделать его более удобным для чтения:

\s(.*?)$ 

не очень ленивы, как нет ничего после ленивых квантор .*?. Это почти то же самое, что и:

\s(.*)$ 

Именно поэтому он находит первое место и все после этого пространства.

Смежные вопросы