2008-10-22 13 views
10

muszę dobrze przetestowane wyrażeń regularnych (styl .net korzystny), albo jakiś inny prosty kawałek kodu, który będzie analizować numer telefonu USA/Kalifornia na części składowe, więc:Parse Numer telefonu na części składowe

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

etc ...

wszystko analizować w:

  • AREACODE: 303
  • Exchange: 555
  • przyrostek: 1234
  • Rozszerzenie: 122

Odpowiedz

2

Jest to jeden używam:

^(?:(?:[\+]?(?<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}))?$ 

Mam to od RegexLib Wierzę.

+3

To jest okropne. Moje oczy krwawią. –

+0

@Paul spróbuj odczytać formattted tak jak ten http://pastebin.com/n9eQjRst –

+0

javascript nie ma nazwanych grup i nie przechwycił rozszerzenia, dopóki nie wstawię? po zasięgu {6,}. Rany z: '/^(?:(?:[\+]?(\d{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

Pozbądź się wszystkiego, co nie jest pierwszą cyfrą. Następnie wszystkie przykłady zredukować do:

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

wspierać wszystkie kody krajów jest trochę bardziej skomplikowana, ale ma zastosowanie ta sama zasada ogólna.

+1

dlaczego zostało to odrzucone? –

1

Ten regex działa dokładnie tak, jak chcesz ze swoimi przykładami:

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

Dodawanie +1 pod uwagę 'nowy Regex (@" 1? \ (? (? [0-9] {3}) \)? [-.]? (? [0-9] {3}) [ -.] *? (? [0-9] {4}) [-. X]? (? [0-9] {3}) ");' np. '+ 13035551234122' – Jaider

19

Żadna z odpowiedzi udzielonych tak daleko było wystarczająco mocne dla mnie, więc kontynuowałem szukanie czegoś lepszego, i znalazłem to:

Google's library for dealing with phone numbers

Mam nadzieję, że przyda się również Tobie.

+0

+1 dla dobrego zasobu, -0,1 dla nie .NET (co było tylko preferencją) Niestety, robimy matematykę całkowitą i jest ona obcięta do 0. – Mir

+2

Czy możesz pokazać, w jaki sposób biblioteka ta mogła przeanalizować numer telefonu do jego części składowych? Jak wspomniał PO, na numer kierunkowy, giełdę i sufiks? – TSmith

0

oto sposób łatwiej na oczy świadczonych przez Z. Directory (vettrasoft.com), ukierunkowane na amerykańskich numerów telefonów:

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(); 

ostatnia linia przechowuje numer do bazy danych tabeli „PHONE_NUMBER”. wartości kolumn: kod_domu = "1", kod_powierzchni = "888", wymiana = "872", itp.

Powiązane problemy