2010-02-14 8 views
2

J'ai une chaîne contenant l'adresse et un numéro de téléphone (format US; (xxx) xxx-xxxx). Par exemple,Expressions régulières .NET - Recherche, remplacement

1243 K. Beverly Bld. # 223 
Los Angeles, CA 41124 
(213) 314-3221 

Ceci est une chaîne unique, j'ai besoin d'extraire le numéro de téléphone en utilisant regex. J'aurais pu utiliser des jetons de chaîne, mais il y a des chances que certaines données invalides soient également concaténées avec cette chaîne. Donc, je pense que l'utilisation d'une expression régulière serait le moyen le plus simple et le plus rapide de trouver un numéro de téléphone. Après avoir trouvé le numéro de téléphone, je dois supprimer de la chaîne d'entrée.

Quelqu'un peut-il partager l'extrait de code rapide?

+0

C# n'a pas d'expressions régulières –

+0

@John: Je voulais dire que je devais utiliser l'expression régulière en C#. Cependant merci de rendre les choses claires. – effkay

Répondre

1
Match matchResults = null; 
try { 
    Regex regexObj = new Regex(@"\(?\b[0-9]{3}\)?[-. ]?[0-9]{3}[-. ]?[0-9]{4}\b"); 
    matchResults = regexObj.Match(subjectString); 
    if (matchResults.Success) { 
     // matched text: matchResults.Value 
     // match start: matchResults.Index 
     // match length: matchResults.Length 
     // backreference n text: matchResults.Groups[n].Value 
     // backreference n start: matchResults.Groups[n].Index 
     // backreference n length: matchResults.Groups[n].Length 
    } else { 
     // Match attempt failed 
    } 
} catch (ArgumentException ex) { 
    // Syntax error in the regular expression 
} 

J'ai reçu cet extrait de RegexBuddy, un très bon assistant pour RegEx.

+0

Merci mon pote! Cependant, j'utilise regex suivant: ((\\ (\ d {3} \\)?) | (\ D {3} -))? \ D {3} - \ d {4} – effkay

+1

C'est bon , mais ne fonctionnera pas si un indicatif régional n'est pas fourni, et ne fonctionnera pas non plus si l'entrée contient un numéro de poste suivant la lettre "x" (puisque '\ b' ne verra pas de limite de mot). L'acceptation de n'importe quel chiffre dans le code régional et l'échange est également trop proche - les chiffres autorisés sont légèrement plus restrictifs dans certains endroits (bien sûr, c'est difficile, mais comme utiliser regex pour les adresses IP, les plages de numéros capturés devraient idéalement être limitées Seules les valeurs autorisées). – richardtallent

+0

@richardtallent: merci; mais le but principal était servi par la solution de labilbe. A propos de la solution que vous avez collée, c'est génial aussi! – effkay

2

Cela fonctionne pour les numéros aux Etats-Unis:

^      # beginning of string, or BOL in multi-line mode 
(?:[+]?1[-. ]){0,1}  # optional calling code, not captured 
\(?      # optional common prefix for area code, not captured 
([2-9][0-8][0-9])?  # optional NANP-allowed area codes, captured in $1 
[)-. ]*     # optional common delimiters after area code, not captured 
(      # begin capture group $2 for exchange code 
    [2-9]     # first digit cannot be a 1 
    (?:[02-9][0-9]|1[02-9])) # second and third digit cannot be "11" 
)       # end capture group for exchange 
[-. ]?     # common delimiters between exchange and SN, not captured 
([0-9]{4})    # subscriber number, captured in $3 
(?:      # start non-capturing group for optional extension 
\s*(?:x|ext|ext.)\s*  # common prefixes before extension numbers 
(\d+)      # optional extension, captured in $4 
){0,1}     # end non-capturing group 
$       # end of string, or EOL in multi-line mode 

Cette poignées codes d'appel (en option), les codes de zone semi-validés (en option) et des codes d'échange, les numéros d'extension (en option), et capture chaque partie du numéro de téléphone dans une variable séparée pour faciliter l'extraction et la manipulation.

En utilisant cette expression dans .NET, vous devez inclure les drapeaux IgnorePatternWhitespace et MultiLine si des virgules sont ignorées et les ^ et $ caractères trouver des numéros de téléphone sur une ligne dans la chaîne.