2008-10-22 8 views
10

je besoin d'un bien testé Expression régulière (style .net préféré), ou d'un autre simple bit de code qui analysera un numéro de téléphone USA/CA en composants, donc:Parse Numéro de téléphone en composants

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

etc ...

tous les analyser dans:

  • AreaCode: 303
  • Echange: 555
  • Suffixe: 1234
  • Extension: 122

Répondre

2

C'est celui que j'utilise:

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

Je l'ai eu de RegexLib je crois.

+3

C'est horrible. Mes yeux saignent. –

+0

@Paul essayer de le lire formaté comme ceci http://pastebin.com/n9eQjRst –

+0

javascript n'a pas de groupes nommés, et il ne capturait pas l'extension jusqu'à ce que je mets un? après la plage {6,}. Enroulé avec: '/^(?:(\[\+]?(\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

Supprimez tout ce qui n'est pas un chiffre en premier. Ensuite, tous vos exemples réduisent à:

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

Pour soutenir tous les codes de pays est un peu plus compliqué, mais la même règle générale applique.

+1

pourquoi était-ce downvoted? Ajout –

1

Ce regex fonctionne exactement comme vous voulez avec vos exemples:

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

+1 en considération 'nouveau Regex (@" 1 \ (( [0-9] {3}) \)?? [-.]? ( [0-9] {3}) [ .? -] * ( [0-9] {4}?) [- x] ( [0-9] {3}?) ").?' par exemple '+ 13035551234122' – Jaider

19

Aucune des réponses données si loin était assez robuste pour moi, donc j'ai continué à chercher quelque chose de mieux, et je l'ai trouvé:

Google's library for dealing with phone numbers

J'espère que c'est aussi utile pour vous.

+0

+1 pour une bonne ressource, -0,1 pour ne pas .NET (qui était seulement une préférence) Malheureusement, nous faisons des mathématiques entier et il est tronqué à 0. – Mir

+2

peut vous montrer comment cette bibliothèque a pu analyser un numéro de téléphone dans ses parties constituantes? Comme l'OP mentionné, dans l'indicatif régional, l'échange, et le suffixe? – TSmith

0

est ici une méthode plus facile sur les yeux fournis par le Directoire Z (vettrasoft.com), orientée vers les numéros de téléphone américains:

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

la dernière ligne stocke le numéro de la table base de données « phone_number ». valeurs de colonne: code_pays = "1", code_de_correspondance = "888", échange = "872", etc.

Questions connexes