RegEx: наименьшее возможное совпадение или ненадежное совпадение

98

Как сообщить RegEx (версия .NET) получить наименьшее допустимое совпадение вместо наибольшего?

Джонатан Аллен
источник

Ответы:

192

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

Также может быть полезна документация по квантификаторам регулярных выражений .

DMI
источник
7
Я не знаю, если я единственный, кто столкнулся с этим недоразумением, но важно отметить: хотя это правда, что нежадный оператор будет соответствовать как можно меньшему количеству символов, он все же может быть не тем совпадением, которое ищет для. «Как можно меньше символов» не означает «кратчайшее возможное совпадение» в соответствии со стандартами RegEx. См. Ответ под моим комментарием: с помощью abcabkи a.+?kRegEx будет соответствовать всей строке.
Finefoot
Строка2 «но без соответствия, если это не абсолютно необходимо»: Что это означает?
Raining
70

Нежадный оператор ?. Вот так:

.*?
Дэвид Хедлунд
источник
45

Нежадный оператор не означает кратчайшее возможное совпадение:

abcabk

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

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

Это последнее возможное совпадение для ' a', для которого разрешены все совпадения k.

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

a[^a]+?k

Джонатан
источник
2
Или ищите в обратном порядке, начиная с конца, когда совпадения вложены: «(ab (abk) bk)».
LBogaardt
7
@LBogaardt, как искать в обратном порядке? не понимаю
азерафати 07
2
@LBogaardt Все еще открытый вопрос: как искать в обратном порядке? Допустим, я хочу получить cab. Если мой ввод caaacabи я ищу, a.*?bон вернет полную строку вместо короткого совпадения внутри. Как мне искать в обратном направлении от b?
C4d
3
Переверните строку, затем примените регулярное выражение.
Джонатан Аллен
3
Это очень полезно. Для людей вроде меня, пытающихся понять, что здесь происходит, общая форма START[^START]*?END(где START и END - ваши регулярные выражения начального и конечного символов). По сути, это означает «сопоставить что-либо от START до END, где промежуточные символы не включают START снова»
derekantrican