Что такое "Вложенный квантификатор" и почему он вызывает ошибку моего регулярного выражения?

У меня есть это регулярное выражение, которое я построил и протестировал в друге regex.

"_ [ 0-9]{10}+ {1}+[ 0-9]{10}+ {2}+[ 0-9]{6}+ {2}[ 0-9]{2}"

Когда я использую это в .Net С#

Я получаю исключение

"parsing \"_ [ 0-9]{10}+ +[ 0-9]{10}+  +[ 0-9]{6}+  [ 0-9]{2}\" - Nested quantifier +."

Что означает эта ошибка? По-видимому .net не нравится выражение.

Вот приятель регулярных выражений, поэтому вы можете понять мое намерение с регулярным выражением...

_ [ 0-9]{10}+ {1}+[ 0-9]{10}+ {2}+[ 0-9]{6}+ {2}[ 0-9]{2}

Match the characters "_ " literally «_ »
Match a single character present in the list below «[ 0-9]{10}+»
   Exactly 10 times «{10}+»
   The character " " « »
   A character in the range between "0" and "9" «0-9»
Match the character " " literally « {1}+»
   Exactly 1 times «{1}+»
Match a single character present in the list below «[ 0-9]{10}+»
   Exactly 10 times «{10}+»
   The character " " « »
   A character in the range between "0" and "9" «0-9»
Match the character " " literally « {2}+»
   Exactly 2 times «{2}+»
Match a single character present in the list below «[ 0-9]{6}+»
   Exactly 6 times «{6}+»
   The character " " « »
   A character in the range between "0" and "9" «0-9»
Match the character " " literally « {2}»
   Exactly 2 times «{2}»
Match a single character present in the list below «[ 0-9]{2}»
   Exactly 2 times «{2}»
   The character " " « »
   A character in the range between "0" and "9" «0-9»

Короче...

Что такое вложенный квантификатор?

Ответ 1

.NET жалуется на + после квантования стиля {n}, поскольку это не имеет никакого смысла. {n} означает соответствие точно n определенной группы. + означает соответствие одной или нескольким из данной группы. Удалите +, и он будет скомпилирован.

"_ [ 0-9]{10} {1}[ 0-9]{10} {2}[ 0-9]{6} {2}[ 0-9]{2}"

Ответ 2

.NET не поддерживает притяжательный квантификатор

{10}+

Однако {10} должен иметь точно такой же эффект. "+" Избегает обратного отслеживания и пытается выполнить более короткие совпадения, если самый длинный матч терпит неудачу, но поскольку {10} может соответствовать только 10 символам, чтобы начать с этого, это не достигается.

"_ [ 0-9]{10} [ 0-9]{10} {2}[ 0-9]{6} {2}[ 0-9]{2}"

должно быть хорошо. Я также сбросил бит "{1} +". Поскольку он совпадает ровно один раз, "A {1} +" эквивалентен просто "A".

ИЗМЕНИТЬ Как говорит Поргес, если вам нужны вещественные квантификаторы в .NET, то атомные группы дают ту же функциональность, что (>[0-9]*) эквивалентно [0-9]*+.

Ответ 3

Они правы. Эта версия вашего регулярного выражения не прерывается:

(_ [ 0-9]{10})+(\s{1})+([ 0-9]{10})+(\s{2})+([ 0-9]{6})+\s{2}[ 0-9]{2}

Обратите внимание на использование parens для создания групп, которые затем могут повторяться один или несколько раз. Кроме того, вы должны быть более конкретными и использовать \s вместо пробела, поскольку пробел шаблона может иметь или не иметь значения.

Кстати, это регулярное выражение не выглядит всем полезным. Возможно, вы захотите задать другой вопрос в строках "Как использовать регулярное выражение для соответствия этому шаблону?"

Ответ 4

Если вы выберете вкус .NET на панели инструментов наверху в RegexBuddy, RegexBuddy укажет, что .NET не поддерживает притяжательные квантификаторы, такие как {10} +.

Так как {10} допускает только одно определенное количество повторений, делает его ленивым или притяжательным бессмысленным, даже если оно синтаксически справедливо в ароматах регулярных выражений, которые поддерживают ленивые и/или притяжательные кванторы. Удаление знаков + из вашего регулярного выражения сделает его хорошо работать с .NET.

В других ситуациях дважды щелкните по ошибке об обладающем квантификатором на вкладке "Создать" в RegexBuddy. Затем RegexBuddy заменит притяжательный квантор на функционально эквивалентную атомную группу.

Если вы создаете фрагмент исходного кода для языка .NET на вкладке "Использование" в RegexBuddy, RegexBuddy автоматически заменит притяжательные квантификаторы в регулярном выражении в фрагменте исходного кода.