Что такое «вложенный квантификатор» и почему он приводит к сбою моего регулярного выражения? - PullRequest
12 голосов
/ 17 октября 2008

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

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

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

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

"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»

Короче ...

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

Ответы [ 4 ]

12 голосов
/ 17 октября 2008

.NET не поддерживает собственнический квантификатор

{10}+

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

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

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

EDIT Как говорит Поргес, если вам нужны притяжательные квантификаторы в .NET, то атомарные группы предоставляют ту же функциональность, что (>[0-9]*) эквивалентно [0-9]*+.

10 голосов
/ 17 октября 2008

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

"_ [ 0-9]{10} {1}[ 0-9]{10} {2}[ 0-9]{6} {2}[ 0-9]{2}"
2 голосов
/ 09 ноября 2008

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

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

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

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

2 голосов
/ 17 октября 2008

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...