Как сделать {n}? а {n} отличаются?
Я пытаюсь понять следующий квантификатор регулярного выражения (здесь просто примерный токен):
a{n}?
Как знак вопроса влияет на совпадение вышеприведенного выражения? И чем он отличается от следующего?
a{n}
Я бы ожидал шаблон aa{1}?a
чтобы соответствовать обоим aaa
а также aa
например. Пока это совпадает aaa
, aa
не совпадает Шаблон a(a{1})?a
действительно совпадает с обоими, так что круглые скобки имеют значение здесь.
Примечание: квантификаторы статьи msdn в регулярных выражениях для обоих состояний:
Квантор {n} соответствует предыдущему элементу ровно n раз, где n - любое целое число.
За {n}?
, добавляет следующую, не слишком полезную часть:
Это ленивый аналог жадного квантификатора {n}+.
1 ответ
Ничего. В статье говорится:
Квантор {n} соответствует предыдущему элементу ровно n раз, где n - любое целое число. {n} жадный квантификатор, ленивый эквивалент которого равен {n}?,
...
{N}? квантификатор соответствует предыдущему элементу ровно n раз, где n - любое целое число. Это ленивый аналог жадного квантификатора {n} +.
Обратите внимание, что текст точно такой же. В основном, добавление ? не меняет поведение квантификатора. Похоже, что механизм регулярных выражений.NET поддерживает {n}?
в качестве альтернативы {n}
,
Интересно, что эта статья содержит ошибку:
Квантор {n,} соответствует предыдущему элементу не менее n раз, где n - любое целое число. {n,} жадный квантификатор, ленивый эквивалент которого равен {n}?,
Это не верно. Ленивый эквивалент {n,}
является {n,}?
который не совпадает с {n}?
,
More a notice than an answer, but good to know, in particular if you project to use a same pattern in different languages or if you decide to use an other regex library with.net.
About:
I would have expected the pattern
aa{1}?a
to match bothaaa
andaa
for example. While it matchesaaa
,aa
is not a match.
a{n}
and a{n}?
produce the same result (there are seen as the greedy and non-greedy version, but of a fixed quantifier) with most of the regex engines.
But this is not the case with Oniguruma and Onigmo regex engines. With them a{n}?
behaves like (?:a{n})?
.
Since wrappers for.net exist for these libraries, it is useful to clarify.
The same with ERE (Extended Regular Expressions) used in sed, grep and with dbms.