Регулярное выражение, соответствующее стандартному 10-значному номеру телефона


125

Я хочу написать регулярное выражение для стандартного номера телефона в США, которое поддерживает следующие форматы:

###-###-####
(###) ###-####
### ### ####
###.###.####

где # означает любое число. Пока что я придумал следующие выражения

^[1-9]\d{2}-\d{3}-\d{4}
^\(\d{3}\)\s\d{3}-\d{4}
^[1-9]\d{2}\s\d{3}\s\d{4}
^[1-9]\d{2}\.\d{3}\.\d{4}

соответственно. Я не совсем уверен, подходит ли последний вариант для пунктирной проверки. Я также хочу знать, есть ли способ написать одно выражение вместо четырех разных, которые подходят для разных форматов, которые я упомянул. Если да, то я не знаю, как мне это сделать. А также как мне изменить выражение / выражения, чтобы я мог также включить условие для поддержки кода области в качестве необязательного компонента. Что-то вроде

+1 ### ### ####

где +1 - код города, это необязательно.


5
возможный дубликат stackoverflow.com/questions/123559/… предлагаемый ответ - удалить все нецифровые символы. Таким образом, вы упрощаете проверку
Арно Денойель

1
Я знаю, что это было некоторое время назад, но я не думаю, что коды городов США могут начинаться с 1. (123) 456-7890 было бы недействительным из-за ведущего 1.
bobanahalf

Для более полного правильного ответа см .: stackoverflow.com/a/18626090/561710
Джо Джонстон,

Разбирать телефонные номера сложно. Для этого Google выпустила библиотеку с открытым исходным кодом. Угощайтесь , используйте libphonenumber (или вилку на вашем языке)
aloisdg переходит на codidact.com

Ответы:


212
^(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]\d{3}[\s.-]\d{4}$

Соответствует следующим

123-456-7890
(123) 456-7890
123 456 7890
123.456.7890
+91 (123) 456-7890

Если вы не хотите совпадать с номерами за пределами США, используйте

^(\+0?1\s)?\(?\d{3}\)?[\s.-]\d{3}[\s.-]\d{4}$

Обновление:
как заметил пользователь Саймон Уивер ниже, если вы также заинтересованы в сопоставлении неформатированных чисел, просто сделайте класс символов разделителя необязательным, как[\s.-]?

^(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$

1
Вы думаете, что вопросительный знак не нужен в (? \ D {3}) части вашей самой первой строки? Я думаю, нам нужно одно или несколько вхождений, а не ноль или одно вхождение цифры в '(' и ')'
noobcoder

2
Это ?относится к круглым скобкам (), а не к цифрам. Полное связанное регулярное выражение \(?\d{3}\)?. \d{3}указывает, что должно быть три цифры между теми (), которые (сделаны) необязательными (по ?).
Рави Таплиял

6
примечание: это не соответствует 1234567890, что может быть или не быть проблемой. для меня это было - поэтому я просто добавил ?после каждого, [\s.-]чтобы сделать его необязательным
Simon_Weaver

1
@Simon_Weaver Спасибо за ваш вклад. Я добавил ваше наблюдение к ответу.
Рави Таплиял

3
Если вам нужен тот, который позволяет избежать упомянутой проблемы @BobRay, используйте ^(\+\d{1,2}\s)?((\(\d{3}\))|(\d{3}))[\s.-]\d{3}[\s.-]\d{4}$. (Я просто продублировал сегмент RegEx, который покрывает код области, и разрешил один вариант с скобками и один без)
Шрей Гупта

131

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

^\s*(?:\+?(\d{1,3}))?[-. (]*(\d{3})[-. )]*(\d{3})[-. ]*(\d{4})(?: *x(\d+))?\s*$

Это соответствует следующим примерам и многому другому:

18005551234
1 800 555 1234
+1 800 555-1234
+86 800 555 1234
1-800-555-1234
1 (800) 555-1234
(800)555-1234
(800) 555-1234
(800)5551234
800-555-1234
800.555.1234
800 555 1234x5678
8005551234 x5678
1    800    555-1234
1----800----555-1234

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

  • Группа 1: код страны (например, 1 или 86)
  • Группа 2: Код города (например: 800)
  • Группа 3: Обмен (например: 555)
  • Группа 4: Абонентский номер (например, 1234)
  • Группа 5: добавочный номер (пример: 5678)

Вот разбивка выражения, если вам интересно:

^\s*                #Line start, match any whitespaces at the beginning if any.
(?:\+?(\d{1,3}))?   #GROUP 1: The country code. Optional.
[-. (]*             #Allow certain non numeric characters that may appear between the Country Code and the Area Code.
(\d{3})             #GROUP 2: The Area Code. Required.
[-. )]*             #Allow certain non numeric characters that may appear between the Area Code and the Exchange number.
(\d{3})             #GROUP 3: The Exchange number. Required.
[-. ]*              #Allow certain non numeric characters that may appear between the Exchange number and the Subscriber number.
(\d{4})             #Group 4: The Subscriber Number. Required.
(?: *x(\d+))?       #Group 5: The Extension number. Optional.
\s*$                #Match any ending whitespaces if any and the end of string.

Чтобы сделать код города необязательным, просто добавьте знак вопроса после (\ d {3}) для кода города.


8
лучший ответ ИМХО. Для моей цели \sв начале и в конце не нужны, потому что я использую для проверки, а поле уже обрезано.
Дэниел

2
Безусловно, лучший и самый полный ответ. Я также очень ценю разбивку регулярных выражений.
Брайант Джексон

@Kondal Мне любопытно, что вы используете, чтобы заставить его потерпеть неудачу. Кажется, у меня нормально работает с 0 для кода страны.
Francis Gagnon

<input type = "text" name = "phone_no" class = "form-control" ng-pattern = "^ \ s * (?: \ +? (\ d {1,3}))? [-. (] * (\ d {3}) [-.)] * (\ d {3}) [-.] * (\ d {4}) (?: * x (\ d +))? \ s * $ "только -numbers ng-maxlength = "10" />
Кондал

@ Кондал Прости. Я имел в виду текст, который вы пытаетесь сопоставить, не работает с этим регулярным выражением.
Francis Gagnon

8

^(\+\d{1,2}\s?)?1?\-?\.?\s?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$

Соответствует этим телефонным номерам:

1-718-444-1122
718-444-1122
(718)-444-1122
17184441122
7184441122
718.444.1122
1718.444.1122
1-123-456-7890
1 123-456-7890
1 (123) 456-7890
1 123 456 7890
1.123.456.7890
+91 (123) 456-7890
18005551234
1 800 555 1234
+1 800 555-1234
+86 800 555 1234
1-800-555-1234
1 (800) 555-1234
(800)555-1234
(800) 555-1234
(800)5551234
800-555-1234
800.555.1234
18001234567
1 800 123 4567
1-800-123-4567
+18001234567
+1 800 123 4567
+1 (800) 123 4567
1(800)1234567
+1800 1234567
1.8001234567
1.800.123.4567
+1 (800) 123-4567
18001234567
1 800 123 4567
+1 800 123-4567
+86 800 123 4567
1-800-123-4567
1 (800) 123-4567
(800)123-4567
(800) 123-4567
(800)1234567
800-123-4567
800.123.4567
1231231231
123-1231231
123123-1231
123-123 1231
123 123-1231
123-123-1231
(123)123-1231
(123)123 1231
(123) 123-1231
(123) 123 1231
+99 1234567890
+991234567890
(555) 444-6789
555-444-6789
555.444.6789
555 444 6789
18005551234
1 800 555 1234
+1 800 555-1234
+86 800 555 1234
1-800-555-1234
1.800.555.1234
+1.800.555.1234
1 (800) 555-1234
(800)555-1234
(800) 555-1234
(800)5551234
800-555-1234
800.555.1234
(003) 555-1212
(103) 555-1212
(911) 555-1212
18005551234
1 800 555 1234
+86 800-555-1234
1 (800) 555-1234

См. Regex101.com


7

Вот довольно компактный, который я создал.

Search: \+?1?\s*\(?-*\.*(\d{3})\)?\.*-*\s*(\d{3})\.*-*\s*(\d{4})$

Replace: +1 \($1\) $2-$3

Протестировано в следующих случаях использования.

18001234567
1 800 123 4567
1-800-123-4567
+18001234567
+1 800 123 4567
+1 (800) 123 4567
1(800)1234567
+1800 1234567
1.8001234567
1.800.123.4567
1--800--123--4567
+1 (800) 123-4567

Это соответствует таким вещам, как (800 444-4444
Джейк,

6

Добавление примера с использованием вышеупомянутых решений на jsfiddle. Я немного изменил код в соответствии с требованиями моих клиентов. Надеюсь, это тоже кому-то поможет.

/^\s*(?:\+?(\d{1,3}))?[- (]*(\d{3})[- )]*(\d{3})[- ]*(\d{4})(?: *[x/#]{1}(\d+))?\s*$/

См. Пример здесь


4

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

((\+92)|0)[.\- ]?[0-9][.\- ]?[0-9][.\- ]?[0-9]

Протестировано в следующих случаях использования.

+92 -345 -123 -4567
+92 333 123 4567
+92 300 123 4567
+92 321 123 -4567
+92 345 - 540 - 5883

4

Регулярное выражение номера телефона, которое я использую: /^[+]?(\d{1,2})?[\s.-]?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$/

Крышки:

  • 18001234567
  • 1 800 123 4567
  • +1 800 123-4567
  • +86 800 123 4567
  • 1-800-123-4567
  • 1 (800) 123-4567
  • (800)123-4567
  • (800) 123-4567
  • (800) 1234567
  • 800-123-4567
  • 800.123.4567

2

Выражения для 1, 3 и 4 очень похожи, поэтому вы можете использовать:

^([1-9]\d{2})([- .])(\d{3})$2(\d{4})$

Обратите внимание, что в зависимости от языка и марки используемых регулярных выражений вам может потребоваться поставить \2вместо, $2или такое сопоставление может вообще не поддерживаться.

Я не вижу хорошего способа объединить это с форматом 2, кроме очевидного, ^(regex for 1,3,4|regex for 2)$которое уродливо, неуклюже и затрудняет извлечение частей чисел.

Что касается кода города, вы можете добавить (\+\d)?в начало, чтобы захватить однозначный код города (извините, я не знаю формат ваших кодов города).


2

Как насчет этого?

^(\+?[01])?[-.\s]?\(?[1-9]\d{2}\)?[-.\s]?\d{3}[-.\s]?\d{4}

РЕДАКТИРОВАТЬ: Я забыл об одном (). РЕДАКТИРОВАТЬ 2: Неправильная первая трехзначная часть.


В .классе символов нет необходимости экранировать точку , так [-\.\s]что на самом деле должно быть [-.\s], потому что мы не хотим совпадать с обратной косой чертой.
Vedran Šego

Будет ли он соответствовать обратной косой черте? Я думал, что в этом нет необходимости, но не был уверен на 100%.
crimson_penguin

Ты прав. Я только что попробовал (мне никогда раньше не требовалась обратная косая черта), [\.]и [.]оба соответствуют только точке, тогда как [\\.]совпадают как точка, так и обратная косая черта. Спасибо за ваше замечание.
Vedran Šego

Мое мнение о регулярных выражениях заключается в том, что если вы даете кому-то регулярное выражение, всегда сопровождайте его объяснением, иначе регулярное выражение бесполезно. Только мое мнение.
Джон Ред

2

Начиная с ответа @Ravi, я также применил некоторые правила проверки для кода NPA (Area) .

В частности:

  • Он должен начинаться с 2 (или выше)
  • Он не может содержать «11» в качестве второй и третьей цифр (N11).

Есть еще пара ограничений, включая зарезервированные блоки (N9X, 37X, 96X) и 555, но я не учел их, особенно потому, что зарезервированные блоки могут использоваться в будущем, а 555 полезен для тестирования.

Вот что я придумал:

^((\+\d{1,2}|1)[\s.-]?)?\(?[2-9](?!11)\d{2}\)?[\s.-]?\d{3}[\s.-]?\d{4}$

В качестве альтернативы, если вы также хотите сопоставить пустые значения (если поле не требуется), вы можете использовать:

(^((\+\d{1,2}|1)[\s.-]?)?\(?[2-9](?!11)\d{2}\)?[\s.-]?\d{3}[\s.-]?\d{4}$|^$)

Мои тестовые примеры для действительных чисел (многие из ответов @Francis):

18005551234
1 800 555 1234
+1 800 555-1234
+86 800 555 1234
1-800-555-1234
1.800.555.1234
+1.800.555.1234
1 (800) 555-1234
(800)555-1234
(800) 555-1234
(800)5551234
800-555-1234
800.555.1234

Мои неверные тестовые примеры включают:

(003) 555-1212     // Area code starts with 0
(103) 555-1212     // Area code starts with 1
(911) 555-1212     // Area code ends with 11
180055512345       // Too many digits
1 800 5555 1234    // Prefix code too long
+1 800 555x1234    // Invalid delimiter
+867 800 555 1234  // Country code too long
1-800-555-1234p    // Invalid character
1 (800)  555-1234  // Too many spaces
800x555x1234       // Invalid delimiter
86 800 555 1212    // Non-NA country code doesn't have +

Мое регулярное выражение не включает группировку для извлечения групп цифр, но его можно изменить, чтобы включить их.


2

Возможно, самый простой по сравнению с несколькими другими.

\(?\d+\)?[-.\s]?\d+[-.\s]?\d+

Соответствует следующему:

(555) 444-6789

555-444-6789

555.444.6789

555 444 6789


Идеальный ... Спасибо (у)
Сушил Шарма

2

Этот код будет соответствовать номеру телефона в США или Канаде, а также будет гарантировать, что это действительный код города и обмен:

^((\+1)?[\s-]?)?\(?[2-9]\d\d\)?[\s-]?[2-9]\d\d[\s-]?\d\d\d\d

Тест на Regex101.com


2

Шаблон Regex для проверки обычного 10-значного телефонного номера плюс дополнительный международный код (от 1 до 3 цифр) и дополнительный добавочный номер (любое количество цифр):

/(\+\d{1,3}\s?)?((\(\d{3}\)\s?)|(\d{3})(\s|-?))(\d{3}(\s|-?))(\d{4})(\s?(([E|e]xt[:|.|]?)|x|X)(\s?\d+))?/g

Демо-версия: https://www.regextester.com/103299

Действительные записи:

/* Full number */
+999 (999) 999-9999 Ext. 99999

/* Regular local phone number (XXX) XXX-XXXX */
1231231231
123-1231231
123123-1231
123-123 1231
123 123-1231
123-123-1231
(123)123-1231
(123)123 1231
(123) 123-1231
(123) 123 1231

/* International codes +XXX (XXX) XXX-XXXX */
+99 1234567890
+991234567890

/* Extensions (XXX) XXX-XXXX Ext. XXX... */
1234567890 Ext 1123123
1234567890Ext 1123123
1234567890 Ext1123123
1234567890Ext1123123

1234567890 Ext: 1123123
1234567890Ext: 1123123
1234567890 Ext:1123123
1234567890Ext:1123123

1234567890 Ext. 1123123
1234567890Ext. 1123123
1234567890 Ext.1123123
1234567890Ext.1123123

1234567890 ext 1123123
1234567890ext 1123123
1234567890 ext1123123
1234567890ext1123123

1234567890 ext: 1123123
1234567890ext: 1123123
1234567890 ext:1123123
1234567890ext:1123123

1234567890 X 1123123
1234567890X1123123
1234567890X 1123123
1234567890 X1123123
1234567890 x 1123123
1234567890x1123123
1234567890 x1123123
1234567890x 1123123

1

Я считаю это регулярное выражение наиболее полезным для 10-значного контактного номера:

^(?:(?:\+|0{0,2})91(\s*[\-]\s*)?|[0]?)?[789]\d{9}$

Ссылка : https://regex101.com/r/QeQewP/1

Объяснение:

введите описание изображения здесь


Вы использовали инструмент для создания этого объяснения? Делитесь! Спасибо
неизвестно 03

@unnknown Похоже на снимок экрана из онлайн-программы проверки регулярных выражений, такой как regex101.com. Обратите внимание, что в рекомендациях SO указано, что весь текст, код, данные и сообщения об ошибках должны вводиться в текстовой форме, а не в виде изображений, потому что текст в изображениях может быть трудно читать, особенно на мобильных устройствах, и требует большей пропускной способности. Также нельзя скопировать текст. В этом случае цвета могут что-то добавить, не уверен. Помните, что обычно «Ответы» должны включать текстовое объяснение. Амитеш: было бы полезно включить ссылку на этот сайт, когда ваше регулярное выражение уже заполнено, чтобы посетители могли поэкспериментировать.
Шерил Хохман

@unnknown вот ссылка, которая создает изображение, подобное изображенному в этом посте. Строка регулярного выражения Амитеша уже вставлена. Вы можете ввести номера телефонов, чтобы проверить ее результаты: regex101.com/r/QeQewP/1
SherylHohman


0

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

(?<number>(\+?(?<country>(\d{1,3}))(\s|-|\.)?)?(\(?(?<region>(\d{3}))\)?(\s|-|\.)?)((?<first>(\d{3}))(\s|-|\.)?)((?<last>(\d{4}))))

0

как насчет нескольких чисел с помощью «+» и разделения их с помощью «;» "," "-" или "" символы?


0

Я закончил с

const regexBase = '(?:\\+?(\\d{1,3}))?[-. (]*(\\d{3})?[-. )]*(\\d{3})[-. ]*(\\d{4,5})(?: *x(\\d+))?'; const phoneRegex = new RegExp('\\s*' + regexBase + '\\s*', 'g');

это должно было разрешить такие вещи, как голландские числа, например

+358 300 20200


0

Над регулярным выражением есть небольшая модификация @Francis Gagnon.

Цель: выявить любую возможную закономерность, по которой пользователь может поделиться своим номером телефона в США.


Версия 1:

^\s*(?:\+?(\d{1,3}))?[\W\D\s]*(\d[\W\D\s]*?\d[\D\W\s]*?\d)[\W\D\s]*(\d[\W\D\s]*?\d[\D\W\s]*?\d)[\W\D\s]*(\d[\W\D\s]*?\d[\D\W\s]*?\d[\W\D\s]*?\d)(?: *x(\d+))?\s*$

Протестируйте здесь Codepen: https://codepen.io/kiranbhattarai/pen/NWKMXQO

Объяснение регулярного выражения: https://regexr.com/4kt5j


Версия 2:

\s*(?:\+?(\d{1,3}))?[\W\D\s]^|()*(\d[\W\D\s]*?\d[\D\W\s]*?\d)[\W\D\s]*(\d[\W\D\s]*?\d[\D\W\s]*?\d)[\W\D\s]*(\d[\W\D\s]*?\d[\D\W\s]*?\d[\W\D\s]*?\d)(?: *x(\d+))?\s*$

Что в нем: тестовые примеры могут быть частью строки. В первой версии тестовые примеры должны быть началом работы.

Codepen: https://codepen.io/kiranbhattarai/pen/GRKGNGG

Объяснение регулярного выражения: https://regexr.com/4kt9n


Если вы найдете шаблон, который может дать сбой, оставьте комментарий, я исправлю его.

Тестовые случаи: Пройдено

8 0   0  4  4  4  5   55 5
1 800 555 1234
+1 800 555-1234
+86 800 555 1234
1-800-555-1234
1 (800) 555-1234
(800)555-1234
(800) 555-1234
(800)5551234
800-555-1234
800.555.1234
800 555 1234x5678
8005551234 x5678
1    800    555-1234
1----800----555-1234
800 (555) 1234
800(555)1234
8 0 0 5 5 5 1 2 3 4
8.0.0.5.5.5.1.2.3.4
8-0-0-5-5-5-1-2-3-4
(8)005551234
(80)05551234
8(00)5551234
8@0@0@5551234
8/0/0/5/5/5/1/2/3/4
8*0*0*5*5*5*1*2*3*4
8:0:0:5:5:5:1:2:3:4
8,0,0,5,5,5,1,2,3,4
800,555,1234
800:555:1234
1-718-444-1122
718-444-1122
(718)-444-1122
17184441122
7184441122
718.444.1122
1718.444.1122
1-123-456-7890
1 123-456-7890
1 (123) 456-7890
1 123 456 7890
1.123.456.7890
+91 (123) 456-7890
18005551234
1 800 555 1234
+1 800 555-1234
+86 800 555 1234
1-800-555-1234
1 (800) 555-1234
(800)555-1234
(800) 555-1234
(800)5551234
800-555-1234
800.555.1234
18001234567
1 800 123 4567
1-800-123-4567
+18001234567
+1 800 123 4567
+1 (800) 123 4567
1(800)1234567
+1800 1234567
1.8001234567
1.800.123.4567
+1 (800) 123-4567
18001234567
1 800 123 4567
+1 800 123-4567
+86 800 123 4567
1-800-123-4567
1 (800) 123-4567
(800)123-4567
(800) 123-4567
(800)1234567
800-123-4567
800.123.4567
1231231231
123-1231231
123123-1231
123-123 1231
123 123-1231
123-123-1231
(123)123-1231
(123) 123-1231
(123) 123 1231
+99 1234567890
+991234567890
(555) 444-6789
555-444-6789
555.444.6789
555 444 6789
1 800 555 1234
+1 800 555-1234
+86 800 555 1234
1-800-555-1234
1.800.555.1234
+1.800.555.1234
1 (800) 555-1234
(800)555-1234
(800) 555-1234
(800)5551234
800-555-1234
800.555.1234
(003) 555-1212
(103) 555-1212
(911) 555-1212
18005551234
1 800 555 1234
+86 800-555-1234
1 (800) 555-1234

+86, +99 и т. Д. Определенно не являются телефонными номерами в США. Некоторые из других ваших тестовых примеров выглядят сомнительными по другим причинам.
Tripleee

@tripleee, позвольте мне исправить это, я обновил его для любой страны, надеюсь, это сработает. Кроме того, я удалил повторяющиеся тестовые случаи,
Киран Бхаттарай,

0

Я просто бросаю этот ответ туда, поскольку он решает мою проблему, он основан на ответе @stormy, но включает трехзначные коды стран и, что более важно, может использоваться в любом месте строки, но не будет соответствовать, если это не перед ним стоит пробел / начало строки и заканчивается границей слова. Это полезно, чтобы не совпадать случайные числа в середине URL-адреса или чего-то подобного.

((?:\s|^)(?:\+\d{1,3}\s?)?1?\-?\.?\s?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4})(?:\b)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.