Jeg vil skrive et regulært uttrykk for et standard amerikansk telefonnummer som støtter følgende formater:
###-###-####
(###) ###-####
### ### ####
###.###.####
der # betyr et hvilket som helst tall. Så langt har jeg kommet opp med følgende uttrykk
^[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}
henholdsvis. Jeg er ikke helt sikker på om den siste er riktig for den stiplede sjekken. Jeg vil også vite om det er noen måte jeg kan skrive et enkelt uttrykk i stedet for de 4 forskjellige som passer til de forskjellige formatene jeg nevnte. I så fall er jeg ikke sikker på hvordan jeg gjør det. Og også hvordan endrer jeg uttrykket/uttrykkene slik at jeg også kan inkludere en betingelse for å støtte retningsnummeret som en valgfri komponent. Noe i retning av
+1 ### ### ####
der +1 er retningsnummeret og det er valgfritt.
Hva med dette?
^(\+?[01])?[-.\s]?\(?[1-9]\d{2}\)?[-.\s]?\d{3}[-.\s]?\d{4}
EDIT: Jeg glemte () en. EDIT 2: Fikk den første 3-sifrede delen feil.
Uttrykkene for 1, 3 og 4 er ganske like, så du kan bruke dem:
^([1-9]\d{2})([- .])(\d{3})$2(\d{4})$
Merk at avhengig av hvilket språk og hvilken type regexer som brukes, kan det hende at du må sette \2
i stedet for $2
, eller at slik matching ikke støttes i det hele tatt.
Jeg ser ingen god måte å kombinere dette med formatet 2, bortsett fra den åpenbare ^(regex for 1,3,4|regex for 2)$
som er stygg, klønete og gjør det vanskelig å få ut delene av tallene.
Når det gjelder retningsnummeret, kan du legge til (\+\d)?
i begynnelsen for å fange opp et ensifret retningsnummer (beklager, jeg kjenner ikke formatet på retningsnumrene dine).