Как сообщить RegEx (версия .NET) получить наименьшее допустимое совпадение вместо наибольшего?
Как сообщить RegEx (версия .NET) получить наименьшее допустимое совпадение вместо наибольшего?
Ответы:
Для регулярного выражения, такого как .*или .+, добавьте вопросительный знак ( .*?или .+?), чтобы сопоставить как можно меньше символов. Чтобы при необходимости сопоставить раздел, (?:blah)?но без сопоставления без крайней необходимости, используйте что-то вроде (?:blah){0,1}?. Для повторяющегося совпадения (с использованием {n,}или {n,m}синтаксисом) добавьте вопросительный знак, чтобы попытаться найти как можно меньше совпадений (например, {3,}?или {5,7}?).
Также может быть полезна документация по квантификаторам регулярных выражений .
Нежадный оператор ?. Вот так:
.*?
Нежадный оператор не означает кратчайшее возможное совпадение:
abcabk
a.+?k будет соответствовать всей строке (в этом примере), а не только последним трем знакам.
Вместо этого я бы хотел найти наименьшее возможное совпадение.
Это последнее возможное совпадение для ' a', для которого разрешены все совпадения k.
Я думаю, единственный способ сделать это - использовать выражение вроде:
a[^a]+?k
cab. Если мой ввод caaacabи я ищу, a.*?bон вернет полную строку вместо короткого совпадения внутри. Как мне искать в обратном направлении от b?
START[^START]*?END(где START и END - ваши регулярные выражения начального и конечного символов). По сути, это означает «сопоставить что-либо от START до END, где промежуточные символы не включают START снова»
abcabkиa.+?kRegEx будет соответствовать всей строке.