Что такое "Вложенный квантификатор" и почему он вызывает ошибку моего регулярного выражения?
У меня есть это регулярное выражение, которое я построил и протестировал в друге 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 автоматически заменит притяжательные квантификаторы в регулярном выражении в фрагменте исходного кода.