Регулярное выражение для соответствия номеру телефона? - PullRequest
2 голосов
/ 15 ноября 2009

Я хочу сопоставить номер телефона, который может содержать буквы и дополнительный дефис:

  • Это действительно: 333-WELL
  • Это также верно: 4URGENT

Другими словами, может быть не более одного дефиса, но если дефиса нет, может быть не более семи символов 0-9 или A-Z.

Я не знаю, как это сделать и "если утверждение" в регулярном выражении. Это вообще возможно?

Ответы [ 5 ]

5 голосов
/ 15 ноября 2009

Я думаю, что это должно сделать это:

/^[a-zA-Z0-9]{3}-?[a-zA-Z0-9]{4}$/

Соответствует 3 буквам или цифрам, за которыми следует дополнительный дефис, за которым следуют 4 буквы или цифры. Этот работает в рубине. В зависимости от того, какой движок регулярных выражений вы используете, вам может потребоваться слегка его изменить.

4 голосов
/ 15 ноября 2009

Вы ищете оператор чередования, обозначенный символом трубы: |

Однако вам может потребоваться либо 7 альтернатив (1 для каждого местоположения дефиса + 1 без дефиса), либо вам может потребоваться дефис между 3 и 4 символами и использование 2 альтернатив.

Одно использование оператора чередования определяет две альтернативы, например:

({3,3}[0-9A-Za-z]-{4,4}[0-9A-Za-z]|{7,7}[0-9A-Za-z])
1 голос
/ 15 ноября 2009

Если вы хотите, чтобы дефис находился где-либо, lookarounds будет вам полезен. Примерно так:

^([A-Z0-9]{7}|(?=^[^-]+-[^-]+$)[A-Z0-9-]{8})$

Этот шаблон состоит из двух основных частей: [A-Z0-9]{7} для сопоставления со строкой без дефисов и (?=^[^-]+-[^-]+$)[A-Z0-9-]{8} для сопоставления со строкой через дефис.

(?=^[^-]+-[^-]+$) будет соответствовать для любой строки с ЕДИНЫМ дефисом (и дефис не является первым или последним символом), тогда часть [A-Z0-9-]{8} будет подсчитывать символы и проверять, все ли они действительны.

1 голос
/ 15 ноября 2009

Не уверен, что это считается, но я бы разбил его на два регулярных выражения:

#!/usr/bin/perl

use strict;
use warnings;

my $text = '333-URGE';

print "Format OK\n" if $text =~ m/^[\dA-Z]{1,6}-?[\dA-Z]{1,6}$/;
print "Length OK\n" if $text =~ m/^(?:[\dA-Z]{7}|[\dA-Z-]{8})$/;

Следует избегать принятия нескольких тире, тире в неправильном месте и т. Д. *

0 голосов
/ 15 ноября 2009

Спасибо Хиту Ханникутту за ответ оператора чередования, а также за пример.

На основании его совета вот мой ответ:

[A-Z0-9]{7}|[A-Z0-9][A-Z0-9-]{7}

Примечание: я проверял свое регулярное выражение здесь . (Только для справки)

...