Как сообщить 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.+?k
RegEx будет соответствовать всей строке.