grep avec regex pour le numéro de téléphone
Je voudrais obtenir les numéros de téléphone à partir d'un fichier. Je sais que les nombres ont des formes différentes, je peux gérer pour un seul, mais vous ne savez pas comment obtenir un uniforme regex. Par exemple
xxx-xxx-xxxx
(xxx)xxx-xxxx
xxx xxx xxxx
xxxxxxxxxx
Je ne peut gérer que les 1, 2 et 4 ainsi que
grep '[0-9]\{3\}[ -]\?[0-9]\{3\}[ -]\?[0-9]\{4\}' file
Est-il une seule regex peut gérer l'ensemble de ces quatre formes?
source d'informationauteur skydoor
Vous devez vous connecter pour publier un commentaire.
Explication:
([0-9]\{3\})
trois chiffres à l'intérieur des parenthèses\|
ou[0-9]\{3\}
trois chiffres pas à l'intérieur de parenthèses...avec le groupement de parenthèses -
\(...\)
- autour de l'alternance de sorte que le reste de la regex se comporte de la même, peu importe laquelle d'autres matchs.Il y a généralement quatre modèles de numéros de téléphone
Dans tous les
Bien sûr, on pourrait simplifier l'expression régulière ci-dessus, mais on peut aussi laisser cette simplification de grep lui-même ~
Vous pouvez simplement OU (
|
) votre regexes ensemble, qui sera plus lisible que trop!C'est juste une version modifiée de Alan Moore solution. Ce est protégée contre certaines condition de course où la dernière partie de ce nombre a plus que quatre chiffres ou si le nombre total de chiffres sont plus que 10:
Explication:
\(([0-9]\{3\})\|[0-9]\{3\}\)
correspond exactement à trois chiffres (par exemple, 234)avec ou sans entouré par des parenthèses.
\|
effectue le " OU " de l'opération.\( ... \)
regroupe le format ci-dessus, suivie par unespace
ou-
ouno space
à tous - ([ -]\?
).\{2\}
correspond exactement à deux occurrences de la ci-dessus[0-9]\{4\} '
correspond exactement à un événement pour un nombre à 4 chiffres suivi par unspace
Et c'est un peu plus courte. Testé sur RHEL et Ubuntu. Cheers!!
Ma première pensée est que vous pouvez trouver plus facile de voir si votre numéro de candidat matchs contre l'un des quatre des expressions régulières. Ce sera plus facile de développer/debug, d'autant que/lorsque vous avez à gérer d'autres formats à l'avenir.
Essayez celui-ci:
^(\d{10}|((([0-9]{3})\s){2})[0-9]{4}|((([0-9]{3})\-){2})[0-9]{4}|([(][0-9]{3}[)])[0-9]{3}[-][0-9]{4})$
C'est seulement applicable pour le format que vous mentionnez ci-dessus comme:
xxxxxxxxxx
xxx xxx xxxx
xxx-xxx-xxxx
(xxx)xxx-xxxx
Nous pouvons mettre tous les numéro de téléphone des validations de l'un par un à l'aide d'un ou d'une condition qui est plus susceptible de bien fonctionner (mais fastidieux de codage).
retourne tous les formats spécifiques :
+?(1[ -])?((\d{3})[ -]|(\d{3}[ -]?)){2}\d{4}
travaille pour:
123-678-1234
123 678 1234
(123)-678-1234
+1-(123)-678-1234
1-(123)-678-1234
1 123 678 1234
1 (123) 678 1234
Correspond à tous vos formats.
La
\<
et\>
les limites de mot empêcher la correspondance des numéros qui sont trop longues, comme123-123-12345
ou1234-123-1234
J'ai obtenu ceci: