Wyrażenie regularne zgodne ze standardowym 10-cyfrowym numerem telefonu

Chcę napisać Wyrażenie regularne dla standardowego numeru telefonu typu US, które obsługuje następujące formaty:

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

Gdzie # oznacza dowolną liczbę. Do tej pory wymyśliłem następujące wyrażenia

^[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}

Odpowiednio. Nie jestem do końca pewien, czy ten ostatni jest poprawny do czeku z kropkami. Chcę też wiedzieć, czy jest jakiś sposób, w jaki mógłbym napisać jedno wyrażenie zamiast 4 różnych, które odpowiadają różnym formatom, o których wspomniałem. Jeśli tak, to nie jestem pewien, jak zrób to. A także Jak mogę zmodyfikować wyrażenie / wyrażenia tak, że mogę również dołączyć warunek obsługi kodu obszaru jako opcjonalny komponent. Coś jak

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

Gdzie +1 jest numerem kierunkowym i jest opcjonalny.

Author: noobcoder, 2013-05-22

17 answers

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

Pasuje do następujących

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

Jeśli nie chcesz dopasować liczb spoza USA użyj

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

Aktualizacja :
Jak zauważył użytkownik Simon Weaver poniżej, jeśli jesteś również zainteresowany dopasowaniem na nieformatowanych liczbach, po prostu ustaw klasę znaków separatora jako opcjonalną jako [\s.-]?

^(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$
 124
Author: Ravi Thapliyal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-12 15:13:54

Istnieje wiele możliwych wariantów tego problemu. Oto Wyrażenie regularne podobne do odpowiedzi, którą wcześniej umieściłem na SO.

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

Pasuje do następujących przykładów i wiele więcej:

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

Niezależnie od sposobu wprowadzania numeru telefonu, grupy przechwytywania mogą być używane do podziału numeru telefonu, dzięki czemu można go przetworzyć w kodzie.

  • Group1: kod kraju (ex: 1 lub 86)
  • Group2: Numer Kierunkowy (ex: 800)
  • Group3: Wymiana (ex: 555)
  • Group4: Numer Abonenta (ex: 1234)
  • Group5: Extension (ex: 5678)

Oto podział wyrażenia, jeśli jesteś zainteresowany:

^\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.

Aby Kod Kierunkowy był opcjonalny, po prostu dodaj znak zapytania po (\d{3}) dla Kodu Kierunkowego.

 76
Author: Francis Gagnon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-22 23:10:45

Dodanie przykładu wykorzystującego powyższe rozwiązania w jsfiddle. Zmodyfikowałem kod nieco zgodnie z wymaganiami moich klientów. Mam nadzieję, że to również komuś pomoże.

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

Zobacz Przykład Tutaj

 6
Author: Avinash Lad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-28 11:35:18

Oto dość kompaktowy, który stworzyłem.

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

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

Przetestowano pod kątem następujących przypadków użycia.

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
 4
Author: Puneet Lamba,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-25 16:26:51

Wyrażenia dla 1, 3 i 4 są dość podobne, więc możesz użyć:

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

Zauważ, że w zależności od języka i marki używanych wyrażeń regularnych, może być konieczne umieszczenie \2 zamiast $2 lub takie dopasowanie może nie być w ogóle obsługiwane.

Nie widzę dobrego sposobu na połączenie tego z formatem 2, poza oczywistym ^(regex for 1,3,4|regex for 2)$, który jest brzydki, niezdarny i sprawia, że trudno jest wydostać części liczb.

Jeśli chodzi o Kod Kierunkowy, możesz dodać (\+\d)? do początku, aby uchwycić jednocyfrowy Numer Kierunkowy (przepraszam, nie znam formatu Twoich kodów kierunkowych).

 2
Author: Vedran Šego,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-22 18:36:41

Co ty na to?

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

EDIT: zapomniałem o (). EDIT 2: pomyliłem pierwszą 3-cyfrową część.

 2
Author: crimson_penguin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-22 18:45:48

Spróbuj tego dla pakistańskich użytkowników .Oto dość kompaktowy, który stworzyłem.

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

Przetestowano pod kątem następujących przypadków użycia.

+92 -345 -123 -4567
+92 333 123 4567
+92 300 123 4567
+92 321 123 -4567
+92 345 - 540 - 5883
 2
Author: sajid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-14 19:06:46

Regex numeru telefonu, którego używam: /^[+]?(\d{1,2})?[\s.-]?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$/

Okładki:

  • 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
Author: Yevhen Kotliar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-31 20:00:38

Być może najłatwiejszy w porównaniu z kilkoma innymi.

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

Pasuje do:

(555) 444-6789

555-444-6789

555.444.6789

555 444 6789

 1
Author: MITHU,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-19 12:50:31

Ten kod będzie pasował do amerykańskiego lub kanadyjskiego numeru telefonu, a także upewni się, że jest to prawidłowy numer kierunkowy i wymiana:

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

Test na Regex101.com

 1
Author: Shino,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-30 14:56:56

Regex patter do walidacji zwykły 10-cyfrowy numer telefonu plus opcjonalny kod Międzynarodowy (od 1 do 3 cyfr) i opcjonalny numer wewnętrzny (dowolna liczba cyfr):

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

Demo: https://www.regextester.com/103299

Ważne wpisy:

/* 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
Author: bocanegra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-01 19:49:33
^(\+1)?\s?(\([1-9]\d{2}\)|[1-9]\d{2})(-|\s|.)\d{3}(-|\s|.)\d{4}
 0
Author: amalgamate,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-22 18:44:25

Zaczynając od odpowiedzi @ Ravi, zastosowałem również kilka zasad walidacji dla kodu NPA (Area) .

W szczególności:

  • powinno zaczynać się od 2 (lub wyższej)
  • nie może mieć "11" jako drugiej i trzeciej cyfry (N11).

Istnieje kilka innych ograniczeń, w tym zarezerwowane bloki (N9X, 37X, 96X) i 555, ale pominąłem je, szczególnie dlatego, że zarezerwowane bloki mogą być używane w przyszłości, a 555 jest przydatny do testowania.

To jest to co wymyśliłem:

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

Alternatywnie, jeśli chcesz dopasować puste wartości( jeśli pole nie jest wymagane), możesz użyć:

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

Moje przypadki testowe dla poprawnych liczb (wiele z odpowiedzi @Francis) to:

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

Moje nieprawidłowe przypadki testowe obejmują:

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

Moje Wyrażenie regularne nie zawiera grupowania w celu wyodrębnienia grup cyfr, ale można je zmodyfikować tak, aby je obejmowały.

 0
Author: MCattle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-28 22:24:02

Jest to bardziej kompleksowa wersja, która będzie pasować tak dużo, jak mogę myśleć, a także daje dopasowanie grupy dla kraju, regionu, pierwszy i ostatni.

(?<number>(\+?(?<country>(\d{1,3}))(\s|-|\.)?)?(\(?(?<region>(\d{3}))\)?(\s|-|\.)?)((?<first>(\d{3}))(\s|-|\.)?)((?<last>(\d{4}))))
 0
Author: jake,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-16 21:57:57

A co z wieloma liczbami z " + "i rozdzieleniem ich znakami";"", "" - "lub""?

 0
Author: radeveloper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-06 07:16:37

Skończyłem z

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

Miało to pozwolić na takie rzeczy jak liczby Holenderskie, na przykład

+358 300 20200

 0
Author: Kelly Milligan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-21 14:01:53

Uważam to wyrażenie regularne za najbardziej przydatne dla mnie dla 10-cyfrowego numeru kontaktowego:

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

Explanation:

Tutaj wpisz opis obrazka

 0
Author: FullStack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-05 13:06:23