Как сделать {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 both aaa and aa for example. While it matches aaa, 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.

Другие вопросы по тегам