Регулярное выражение для соответствия стандарту 10-значного номера телефона
Я хочу написать регулярное выражение для стандартного телефонного номера телефона США, который поддерживает следующие форматы:
###-###-####
(###) ###-####
### ### ####
###.###.####
где # означает любое число. До сих пор я придумал следующие выражения
^[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 - код области, и это необязательно.
Ответы
Ответ 1
^(\+\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}$
Ответ 2
Для этой проблемы существует много вариантов. Вот регулярное выражение, похожее на ответ, который я ранее разместил на 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: Exchange (например: 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}) для кода области.
Ответ 3
Добавление примера с использованием вышеупомянутых решений на jsfiddle. Я немного изменил код в соответствии с моим требованием клиентов. Надеюсь, это тоже кому-то поможет.
/^\s*(?:\+?(\d{1,3}))?[- (]*(\d{3})[- )]*(\d{3})[- ]*(\d{4})(?: *[x/#]{1}(\d+))?\s*$/
Смотрите пример здесь
Ответ 4
Здесь довольно компактный, который я создал.
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
Ответ 5
/^[+]?(\d{1,2})?[\s.-]?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{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
Ответ 6
попробуйте это для пакистанских пользователей. Вот довольно компактный, который я создал.
((\+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
Ответ 7
Как насчет этого?
^(\+?[01])?[-.\s]?\(?[1-9]\d{2}\)?[-.\s]?\d{3}[-.\s]?\d{4}
EDIT: Я забыл о().
РЕДАКТИРОВАТЬ 2: неправильно записана первая 3-значная часть.
Ответ 8
Выражения для 1, 3 и 4 очень похожи, поэтому вы можете использовать:
^([1-9]\d{2})([- .])(\d{3})$2(\d{4})$
Обратите внимание, что в зависимости от языка и бренда используемых регулярных выражений вам может потребоваться поставить \2
вместо $2
или такое совпадение может вообще не поддерживаться.
Я не вижу хорошего сочетания этого с форматом 2, кроме очевидного ^(regex for 1,3,4|regex for 2)$
, который является уродливым, неуклюжим и затрудняет извлечение частей чисел.
Что касается кода области, вы можете добавить (\+\d)?
в начало для захвата кода с одной цифрой (извините, я не знаю формат ваших кодов области).
Ответ 9
Этот код будет соответствовать номеру телефона в США или Канаде, а также будет гарантировать, что он является действительным кодом города, и обмениваются:
^((\+1)?[\s-]?)?\(?[2-9]\d\d\)?[\s-]?[2-9]\d\d[\s-]?\d\d\d\d
Тест на Regex101.com
Ответ 10
Регулярное выражение для проверки правильности 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
Ответ 11
Возможно, самый простой из них сравнивается с несколькими другими.
\(?\d+\)?[-.\s]?\d+[-.\s]?\d+
Он соответствует следующему:
(555) 444-6789
555-444-6789
555.444.6789
555 444 6789
Ответ 12
^(\+1)?\s?(\([1-9]\d{2}\)|[1-9]\d{2})(-|\s|.)\d{3}(-|\s|.)\d{4}
Ответ 13
Начиная с ответа @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 +
Мое регулярное выражение не включает группировку для извлечения групп цифр, но ее можно изменить, чтобы включить ее.
Ответ 14
Это более полная версия, которая будет соответствовать столько, сколько я могу себе представить, а также дать вам групповое сопоставление для страны, региона, первой и последней.
(?<number>(\+?(?<country>(\d{1,3}))(\s|-|\.)?)?(\(?(?<region>(\d{3}))\)?(\s|-|\.)?)((?<first>(\d{3}))(\s|-|\.)?)((?<last>(\d{4}))))
Ответ 15
как насчет нескольких чисел с "+" и разделять их на ";" "," "или" "?
Ответ 16
Я закончил с
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
Ответ 17
Я нахожу это регулярное выражение наиболее полезным для меня для 10-значного контактного номера:
^(?:(?:\+|0{0,2})91(\s*[\-]\s*)?|[0]?)?[789]\d{9}$
Пояснение:
Ответ 18
^(\+\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