2009-12-17 3 views

ответ

116

Для регулярного выражения, как .* или .+, добавьте знак вопроса (.*? или .+?), чтобы соответствовать, как несколько символов, насколько это возможно. Для необязательного соответствия разделу (?:blah)?, но без согласования, если это абсолютно необходимо, используйте что-то вроде (?:blah){0,1}?. Для повторяющегося соответствия (либо с использованием {n,}, либо {n,m}) добавьте вопросительный знак, чтобы попытаться соответствовать как можно меньше (например, {3,}? или {5,7}?).

Документация по адресу regular expression quantifiers также может быть полезна.

+1

Я не знаю, если я только один с этим недоразумением, но важно отметить: Хотя верно, что не-жадный оператор будет соответствовать как можно большему количеству символов, он все равно может не совпадать с тем, что он ищет. «Как можно меньше символов» не соответствует «кратчайшему возможному совпадению» в отношении стандартов RegEx. См. Ответ ниже моего комментария: с помощью 'abcabk' и' a. +? K' RegEx будет соответствовать всей строке. – Jayjayyy

47

Нежирный оператор, ?. Как так:

.*? 
17

НЕРАСПРОСТРАНЕНИИ жадный оператор не означает кратчайшее матч:

abcabk

a.+?k будет соответствовать всей строке (в данном примере), вместо того, чтобы только последние три знака.

Я бы хотел найти наименьшее возможное совпадение.

Это последний возможный матч для 'a', чтобы еще разрешить все совпадения для k.

Я думаю, единственный способ сделать это состоит в использовании выражения, как:

a[^a]+?k 
+1

Или выполните поиск в обратном порядке, начиная с конца, когда совпадения вложены: «(ab (abk) bk»). – LBogaardt

+5

@ LBogaardt как бы искать в обратном порядке? не получится – azerafati

+1

@LBogaardt Еще открытый вопрос: как искать в обратном порядке? Допустим, я хочу получить «такси». Если мой ввод 'caaacab' и я ищу' a. *? B', он вернет полную строку вместо короткого совпадения внутри. Как мне искать назад от 'b'? – C4u

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