Регулярне вираження, яке відповідає стандартному 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}

відповідно. Я не зовсім впевнений, чи є останній правильним для пунктирної перевірки. Я також хочу знати, чи є якийсь спосіб я можу написати один вираз замість 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}$

Оновлення:
Як зауважив користувач Simon Weaver нижче, якщо ви також зацікавлені в збігу на неформатовані числа, просто зробіть клас символів роздільника необов’язковим як[\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, який охоплює код району і дозволив один варіант з паренами і один без)
Шрей Гупта

128

Для цієї проблеми можливе багато варіантів. Ось регулярний вираз, подібний до відповіді, яку я раніше розміщував на 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}) коду області.


7
найкраща відповідь ІМХО. З моєї мети, \sна початку та в кінці не потрібні, тому що я використовую для перевірки, а поле вже оброблене.
Даніель

1
На сьогодні найкраща відповідь і найповніша. Я також дуже вдячний у розрізі регулярного виразів.
Брайант Джексон

@Kondal Мені цікаво про вхід, який ви використовуєте, щоб зробити його невдалим. Здається, мені добре працює з кодом країни 0.
Френсіс Ганьон

<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" />
Кондал

@Kondal Вибачте. Я мав на увазі текст, який ви намагаєтеся зіставити, який не вдається з цим регулярним виразом.
Френсіс Ганьон

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}

EDIT: Я забув про (). EDIT 2: неправильно отримав першу 3-значну частину.


Немає необхідності уникнути крапки, .коли перебуває в класі символів, так і [-\.\s]має бути насправді [-.\s], тому що ми не хочемо співставляти зворотну косу рису.
Ведран Шего

Чи насправді це відповідатиме зворотній косої риси? Я подумав, що це може не бути необхідним, але я не був на 100% впевнений.
crimson_penguin

Ти правий. Я щойно спробував це (мені ніколи раніше не потрібен був зворотний кут нахилу), [\.]і [.]обидва відповідають лише крапкою, в той час як [\\.]збігаються як крапка, так і кута нахилу. Дякую за ваше зауваження.
Ведран Шего

Моя думка щодо регулярних виразів полягає в тому, що, якщо ви комусь надаєте регулярний вираз, завжди додайте його до пояснення, інакше регулярний вигляд є марним. Просто моя думка.
Джон Ред

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


Ідеальний ... Дякую (у)
Sushil Sharma

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

Пояснення:

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


Ви використовували інструмент для створення цього пояснення? Діліться! Спасибі
невідомо

@unnknown Виглядає як скріншот із онлайн-перевірки регулярних виразів, наприклад regex101.com. Зауважте, що в керівних документах SO зазначено, що всі текстові, кодові, дані та повідомлення про помилки повинні бути введені у текстовій формі, а не у зображеннях, оскільки текст у зображеннях може бути важко читати, особливо на мобільних пристроях, і має більшу пропускну здатність. Також текст не можна копіювати. У цьому випадку кольори можуть щось додати, не впевнений. Знайте, що загалом "Відповіді" повинні містити текстове пояснення. Амітеш: корисно було б включити посилання на цей сайт, коли ваш регекс вже заповнений, щоб відвідувачі могли експериментувати.
SherylHohman

@unnknown тут - посилання, яке створює зображення, схоже на зображення в цій публікації. Рядок регулярних виразів Amitesh вже вставлений. Ви можете ввести телефонні номери, щоб перевірити його результати: 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.