2013-08-01 2 views
7

Я пытаюсь понять следующее регулярное выражение квантор ( является лишь примерным маркер здесь):Как сделать {n}? и {n} отличаются?

a{n}? 

Как знак вопроса влияет на матч выше выражения? И как он отличается от следующего?

a{n} 

я ожидал бы шаблон aa{1}?a, чтобы соответствовать как aaa и aa, например. Пока он соответствует aaa, aa является не матч. Шаблон a(a{1})?a действительно соответствует обоим, поэтому круглые скобки действительно имеют значение здесь.


Примечание: В статье MSDN Quantifiers in Regular Expressions состояния для обоих:

The {n} quantifier matches the preceding element exactly n times, where n is any integer.

Для {n}?, он добавляет следующее, не слишком полезной части:

It is the lazy counterpart of the greedy quantifier {n}+.

+1

Что это связано с C#? –

+0

@AustinHenley может быть, он имеет в виду это только в контексте C# Regex. – TheVillageIdiot

+0

Значок вопроса может сделать переменные обнуляемыми. – Max

ответ

7

Ничего. В статье указывается:

The {n} quantifier matches the preceding element exactly n times, where n is any integer. {n} is a greedy quantifier whose lazy equivalent is {n}?.

The {n}? quantifier matches the preceding element exactly n times, where n is any integer. It is the lazy counterpart of the greedy quantifier {n}+.

Обратите внимание, что текст в точности такой же. В основном, добавив ? не изменяет поведение квантификатора. Похоже, что механизм регулярных выражений .NET поддерживает {n}? в качестве альтернативы {n}.


Интересно, что эта статья не по всей видимости, содержит ошибку:

The {n,} quantifier matches the preceding element at least n times, where n is any integer. {n,} is a greedy quantifier whose lazy equivalent is {n}?.

Это неправильно. Ленивым эквивалентом {n,} является {n,}?, который является не так же, как {n}?.

+0

Итак, похоже версия с вопросительным знаком ('{n}?') реализована (и документирована) только для полноты, потому что ее братья и сестры '{n,}?' и '{n, m}?' также существуют? –

+1

@MariusSchulz Да, я бы так сказал. В статье представлен пример с помощью '{n}?', но этот код ведет себя одинаково, если вы замените его на' {n} '. –

+8

Некоторые люди, столкнувшись с проблемой, думают: «Я знаю, я буду использовать регулярные выражения». Теперь у них проблемы с '{n}?'. –

Смежные вопросы