Регулярное выражение для соответствия стандартному 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 ответов:
^(\+\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
регулярное выражение скороговоркой для проверки 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
начиная с ответа @ 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}))))