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


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

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

где # - любая цифра. До сих пор я придумал следующие выражения

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

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

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

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

17 69

17 ответов:

^(\+\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}$

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

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

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

^\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)
  • Group2: код города (ex: 800)
  • Group3: Exchange (ex: 555)
  • Group4: номер абонента (например: 1234)
  • Group5: расширение (например: 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}) для кода области.

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

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

Смотрите Пример Здесь

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

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

Replace: +1 \(\) -

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

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

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

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

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

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

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

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

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

EDIT: я забыл о () Один. EDIT 2: получил первую 3-значную часть неправильно.

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

((\+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

номер телефона регулярное выражение, которое я использую: /^[+]?(\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

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

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

Он соответствует следующим:

(555) 444-6789

555-444-6789

555.444.6789

555 444 6789

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

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

тест ВКЛ Regex101.com

регулярное выражение скороговоркой для проверки a обычный 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)?\s?(\([1-9]\d{2}\)|[1-9]\d{2})(-|\s|.)\d{3}(-|\s|.)\d{4}

начиная с ответа @ 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 +

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

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

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

Как насчет нескольких чисел с " + "и отделить их с";", " - " или "" символы?

Я закончил с

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

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

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

объяснение :

enter image description here