Reguliere uitdrukking die overeenkomt met het standaard 10-cijferige telefoonnummer

Ik wil een reguliere expressie schrijven voor een standaard Amerikaans telefoonnummer dat de volgende notaties ondersteunt:

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

waarbij # een willekeurig getal betekent. Tot nu toe heb ik de volgende uitdrukkingen bedacht

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

respectievelijk. Ik weet niet helemaal zeker of de laatste juist is voor het gestippelde vinkje. Ik wil ook weten of er een manier is om een enkele uitdrukking te schrijven in plaats van de 4 verschillende die geschikt zijn voor de verschillende formaten die ik noemde. Zo ja, dan weet ik niet hoe ik dat moet doen. En ook hoe wijzig ik de uitdrukking/uitdrukkingen zodat ik ook een voorwaarde kan opnemen om het netnummer als optioneel onderdeel te ondersteunen. Iets als

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

waarbij +1 het netnummer is en optioneel is.


Antwoord 1, autoriteit 100%

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

Komt overeen met het volgende

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

Als u geen overeenkomst op niet-Amerikaanse nummers wilt, gebruik dan

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

Bijwerken:
Zoals gebruiker Simon Weaver hieronder opmerkte, als je ook geïnteresseerd bent in het matchen op niet-geformatteerde getallen, maak dan de klasse van het scheidingsteken optioneel als [\s.-]?

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

Antwoord 2, autoriteit 61%

Er zijn veel variaties mogelijk voor dit probleem. Hier is een reguliere expressie die lijkt op een antwoord dat ik eerder op SO heb geplaatst.

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

Het zou overeenkomen met de volgende voorbeelden en nog veel meer:

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

Ongeacht de manier waarop het telefoonnummer is ingevoerd, kunnen de vastleggroepen worden gebruikt om het telefoonnummer uit te splitsen, zodat u het in uw code kunt verwerken.

  • Groep1: Landcode (bijvoorbeeld: 1 of 86)
  • Groep 2: Netnummer (bijvoorbeeld: 800)
  • Groep3: Exchange (ex: 555)
  • Groep 4: abonneenummer (bijv. 1234)
  • Groep5: Toestel (ex: 5678)

Hier is een uitsplitsing van de uitdrukking als je geïnteresseerd bent:

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

Om het netnummer optioneel te maken, voegt u gewoon een vraagteken toe na de (\ D {3}) voor het netnummer.


Antwoord 3, Autoriteit 9%

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

komt overeen met deze telefoonnummers:

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

Zie regex101.com


Antwoord 4, autoriteit 3%

Hier is een vrij compacte die ik heb gemaakt.

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

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

Getest op basis van de volgende gebruiksscenario’s.

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

Antwoord 5, autoriteit 2%

Een voorbeeld optellen met bovengenoemde oplossingen op jsfiddle.
Ik heb de code een beetje aangepast volgens de eis van mijn klanten. Ik hoop dat dit ook iemand helpt.

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

Bekijk hier een voorbeeld


Antwoord 6, autoriteit 2%

probeer dit voor Pakistaanse gebruikers. Hier is een vrij compacte die ik heb gemaakt.

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

Getest op basis van de volgende gebruiksscenario’s.

+92 -345 -123 -4567
+92 333 123 4567
+92 300 123 4567
+92 321 123 -4567
+92 345 - 540 - 5883

Antwoord 7, autoriteit 2%

Telefoonnummer regex dat ik gebruik:
/^[+]?(\d{1,2})?[\s.-]?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$/

Omslagen:

  • 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

Antwoord 8, autoriteit 2%

Regex-patroon om een normaal 10-cijferig telefoonnummerplus optionele internationale code(1 tot 3 cijfers) en optioneel toestelnummer(elke aantal cijfers):

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

Geldige inzendingen:

/* 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

Antwoord 9

Om te beginnen met het antwoord van @Ravi, heb ik ook enkele validatieregels voor de NPA (gebieds)codetoegepast .

In het bijzonder:

  • Het moet beginnen met een 2 (of hoger)
  • Het mag geen “11” hebben als tweede en derde cijfer (N11).

Er zijn nog een paar andere beperkingen, waaronder gereserveerde blokken (N9X, 37X, 96X) en 555, maar die heb ik weggelaten, vooral omdat de gereserveerde blokken in de toekomst kunnen worden gebruikt, en 555 is handig om te testen.

Dit is wat ik bedacht:

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

Als u ook lege waarden wilt matchen (als het veld niet verplicht is), kunt u ook het volgende gebruiken:

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

Mijn testgevallen voor geldige nummers (veel van het antwoord van @Francis) zijn:

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

Mijn ongeldige testgevallen omvatten:

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

Mijn reguliere expressie bevat geen groepering om de cijfergroepen te extraheren, maar kan worden gewijzigd om deze wel op te nemen.


Antwoord 10

De uitdrukkingen voor 1, 3 en 4 lijken veel op elkaar, dus je kunt het volgende gebruiken:

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

Houd er rekening mee dat, afhankelijk van de taal en het merk van de gebruikte regexes, je misschien \2moet plaatsen in plaats van $2, anders wordt een dergelijke overeenkomst mogelijk helemaal niet ondersteund.

Ik zie geen goede manier om dit te combineren met de indeling 2, afgezien van de voor de hand liggende ^(regex for 1,3,4|regex for 2)$die lelijk, onhandig is en het maakt moeilijk om de delen van de cijfers eruit te krijgen.

Wat betreft het netnummer, u kunt (\+\d)?aan het begin toevoegen om een enkelcijferig netnummer vast te leggen (sorry, ik ken de indeling van uw regio niet codes).


Antwoord 11

Wat dacht je hiervan?

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

EDIT: ik ben de () vergeten.
EDIT 2: Ik heb het eerste 3-cijferige deel verkeerd.


Antwoord 12

Misschien wel de gemakkelijkste in vergelijking met verschillende andere.

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

Het komt overeen met het volgende:

(555) 444-6789

555-444-6789

555.444.6789

555 444 6789


Antwoord 13

Deze code komt overeen met een US- of Canadian-telefoonnummer en zorgt er ook voor dat het een geldig gebiedscode en uitwisseling is:

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

test op regex101.com


Antwoord 14

Ik vind deze reguliere expressie het meest nuttig voor mij voor 10-cijferige contactnummer:

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

referentie : https://regex101.com/r/qeqewp/ 1

Uitleg:


Antwoord 15

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

Antwoord 16

Dit is een meer uitgebreide versie die zoveel overeenkomt met zo goed als ik kan bedenken en je groepsvergelijking voor land, regio, eerst en laatste geven.

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

Antwoord 17

Hoe zit het met meerdere nummers met “+” en scheid ze met “;” “,” “-” of “” tekens?


Antwoord 18

Ik eindigde met


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

dit was om bijvoorbeeld nederlandse nummers mogelijk te maken

+358 300 20200


Antwoord 19

Boven regex is een kleine wijziging van@Francis Gagnon.

Doel:om een mogelijk patroon te detecteren, kan een gebruiker zijn Amerikaanse telefoonnummer delen


Versie 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*$

Test het hier Codepen: https://codepen.io/kiranbhattarai/pen/NWKMXQO

Uitleg van de regex: https://regexr.com/4kt5j


Versie 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*$

Wat zit erin: De testgevallen kunnen een deel van de string zijn. In versie één zouden de testgevallen een begin moeten zijn om te werken.

Codepen: https://codepen.io/kiranbhattarai/pen/GRKNGG

Uitleg van de regex: https://regexr.com/4kt9n


Als je een patroon kunt vinden dat kan mislukken, reageer dan alsjeblieft, ik zal het repareren.

Testcases: geslaagd

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

Antwoord 20

Ik gooi dit antwoord er gewoon in omdat het een probleem van mij oplost, het is gebaseerd op het antwoord van @stormy, maar bevat driecijferige landcodes en, belangrijker nog, kan overal in een reeks worden gebruikt, maar komt niet overeen is dat het niet wordt voorafgegaan door een spatie/begin van de tekenreeks en eindigt met een woordgrens. Dit is handig, zodat het niet overeenkomt met willekeurige getallen in het midden van een URL of zoiets

((?:\s|^)(?:\+\d{1,3}\s?)?1?\-?\.?\s?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4})(?:\b)

Other episodes