Проблема с регулярным выражением с \ d * и | [Дубликат]

Я считаю, что Number :: Phone :: US и Regexp :: Common (особенно источник Regexp :: Common :: URI :: RFC2806 ) Могут помочь модули Perl.

Возможно, вопрос должен быть задан более подробно, чтобы объяснить цель проверки чисел. Например, 911 является допустимым числом в США, но 911x не имеет значения x. Это значит, что телефонная компания может рассчитать, когда вы закончите набор. Существует несколько вариантов этой проблемы. Но ваше регулярное выражение не проверяет часть кода области, поэтому это не вызывает беспокойства.

Как и для проверки адресов электронной почты, даже если у вас есть действительный результат, вы не можете знать, назначено ли оно кому-то, пока вы не попробуете его.

Если вы пытаетесь проверить ввод пользователя, почему бы не нормализовать результат и не сделать с ним? Если пользователь вводит номер, который вы не можете распознать как действительный номер, сохраните его как введенный или вычеркнутый недопустимый символ. Модуль Number :: Phone :: Normalize Perl может быть источником вдохновения.

0
задан Alex Chamberlain 21 March 2015 в 19:06
поделиться

3 ответа

Шаблоны регулярных выражений оцениваются слева направо. Поместите шаблон, который имеет более высокий приоритет, чем первый ( слева от | ), а младший приоритет - второй ( справа от | ). Обратите внимание, что второму шаблону не разрешалось соответствовать тексту, который уже был сопоставлен первым шаблоном. То есть, regex engine по умолчанию не будет выполнять совпадающие совпадения. Чтобы заставить механизм регулярного выражения выполнять совпадение совпадений, вам нужно поместить свой шаблон внутри группы захвата и снова поместить группу захвата в положительное утверждение поиска ( позитивный lookahead и положительный lookbehind ).

mo = re.match('(cccd)|(c*)', 'cccd')
4
ответ дан Avinash Raj 20 August 2018 в 16:15
поделиться
  • 1
    Точно, первое регулярное выражение будет удовлетворено, и, следовательно, второе станет неуместным. – Malik Brahimi 21 March 2015 в 19:12
  • 2
    Я думаю, что моя путаница была с жадностью и самым длинным матчем. – Alex Chamberlain 21 March 2015 в 19:39

Ваше регулярное выражение ((c*)|(cccd)) означает совпадение любой из двух вещей:

  1. 0 или неограниченный c's
  2. Литеральная последовательность cccd

Поскольку регулярные выражения жадные, он потребляет строку ccc в качестве соответствия, так что это то, что вы возвращаете. Сначала попробуем, что когда-либо наступит раньше (в этом случае c*, и если он сможет сделать совпадение, то это будет.

Чтобы исправить то, что вы хотите, попробуйте регулярное выражение: (cccd)|(c*). При этом:

>>> mo = re.match('(cccd)|(c*)', 'cccd')
>>> mo.group(0)
'cccd'

Пример здесь: https://regex101.com/r/aU8pE7/1

1
ответ дан Jason Brooks 20 August 2018 в 16:15
поделиться

(c*) соответствует 'ccc', таким образом вы получаете совпадение. Для соответствия «cccd» используйте ^(?:(c*)|(cccd))$

См. demo .

0
ответ дан Wiktor Stribiżew 20 August 2018 в 16:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: