2008-10-22 12 views
10

Ich brauche eine gut getestet Regular Expression (.net Stil bevorzugt) oder eine andere einfache Bit-Code, der eine USA/CA Telefonnummer in der Komponententeile analysieren wird, so:Parse Telefonnummer in Einzelteile

  • 1-303-555-1234x122
  • (303) 555-1234-122
  • 1 (303) 555 -1234-122

etc ...

alle analysieren in:

  • Area: 303
  • Austausch: 555
  • Suffix: 1234
  • Erweiterung: 122

Antwort

2

derjenige Dies ist ich benutze:

^(?:(?:[\+]?(?<CountryCode>[\d]{1,3}(?:[ ]+|[\-.])))?[(]?(?<AreaCode>[\d]{3})[\-/)]?(?:[ ]+)?)?(?<Number>[a-zA-Z2-9][a-zA-Z0-9 \-.]{6,})(?:(?:[ ]+|[xX]|(i:ext[\.]?)){1,2}(?<Ext>[\d]{1,5}))?$ 

Ich habe es von RegexLib Ich glaube.

+3

Das ist schrecklich. Meine Augen bluten. –

+0

@Paul versuchen, es zu lesen formatted wie folgt http://pastebin.com/n9eQjRst –

+0

Javascript hat keine benannten Gruppen, und es war nicht erfassen die Erweiterung, bis ich ein? nach dem {6,} Bereich. Verwundet mit: '/^(?:(?[\+]?(\{1,3}(?:\s+|[\-\.])))?[\(]?(\d {3}) [\ - \ /)]? (?: \ S +)?)? ([A-zA-Z2-9] [a-zA-Z0-9 \ - \.] {6,}?) (?: (?: \ s + | [xX] | (?: [Ee] xt [\.]?)) {1,2} (\ d {1,5}))? $/' –

1

Streifen Sie alles aus, was nicht die erste Ziffer ist. Dann werden alle Ihre Beispiele reduzieren:

/^1?(\d{3})(\d{3})(\d{4})(\d*)$/

Um alle Ländercodes zu unterstützen ein wenig komplizierter, aber die gleiche allgemeine Regel gilt.

+1

Warum wurde das abgelehnt? –

1

Diese Regex funktioniert genau so, wie Sie mit Ihren Beispielen wollen:

Regex regexObj = new Regex(@"\(?(?<AreaCode>[0-9]{3})\)?[-. ]?(?<Exchange>[0-9]{3})[-. ]*?(?<Suffix>[0-9]{4})[-. x]?(?<Extension>[0-9]{3})"); 
Match matchResult = regexObj.Match("1 (303) 555 -1234-122"); 

// Now you have the results in groups 
matchResult.Groups["AreaCode"]; 
matchResult.Groups["Exchange"]; 
matchResult.Groups["Suffix"]; 
matchResult.Groups["Extension"]; 
+0

Hinzufügen von +1 in Erwägung 'new Regex (@" 1? \ (? (? [0-9] {3}) \)? [-.]? (? [0-9] {3}) [ -.] *? (? [0-9] {4}) [-. X]? (? [0-9] {3}) ");' z '+ 13035551234122' – Jaider

19

Keine der gegebenen Antworten so weit war robust genug für mich, also suchte ich weiter nach etwas, und ich fand es:

Google's library for dealing with phone numbers

Ich hoffe, es ist auch nützlich für Sie.

+0

+1 für gute Ressource, -0.1 für nicht .NET (was nur eine Präferenz war) Leider machen wir Ganzzahl Mathe und es wird auf 0 abgeschnitten. – Mir

+2

Können Sie zeigen, wie diese Bibliothek konnte analysieren eine Telefonnummer in ihre Bestandteile? Wie das OP erwähnte, in Vorwahl, Austausch und Suffix? – TSmith

0

hier ist eine Methode leichter auf den Augen durch das Z-Verzeichnis zur Verfügung gestellt (vettrasoft.com), ausgerichtet auf amerikanische Telefonnummern:

string_o s2, s1 = "888/872.7676"; 
z_fix_phone_number (s1, s2); 
cout << s2.print();  // prints "+1 (888) 872-7676" 
phone_number_o pho = s2; 
pho.store_save(); 

die letzte Zeile speichert die Anzahl an Datenbanktabelle „phone_number“. Spaltenwerte: country_code = "1", area_code = "888", exchange = "872", usw.