2011-05-04 3 views
2

Comment faire pour supprimer une chaîne de tout sauf des nombres et la lettre x (si elle existe) avec regex en Perl?Perl regex: Numéros et X

2x4 works 
x3405 does not work 
2 works 

Essayer de faire la meilleure réponse mais je n'en ai aucune idée.

Ce pour autant que je peux obtenir sans la visser jusqu'à:

$string =~ s/[\D]//gi; 

Ou suis-je dirigé dans la mauvaise direction?

A comprehensive regex for phone number validation

Répondre

1

Vous pouvez utiliser le code suivant:

$string =~ s/[^\dx]//gi; 
5

Utilisez l'opérateur de translittération:

$string =~ y/0-9x//cd; 

Notez que dans ce nouveau monde unicode, \ D et \ d signifie plus que juste 0-9, et 0-9 est probablement ce qui est recherché ici.

+0

C'est exactement ce que je cherchais. Je ne savais pas à propos de // //: D merci beaucoup! –

7

L'opérateur tr peut être utilisé pour supprimer les caractères:

$string =~ tr/0-9x//cd; 

Lorsque le drapeau c indique « correspond à l'opposé » et le drapeau d signifie « supprimer ». NB: l'opérateur de translittération est également disponible en tant que y///, mais est également référencé tr après l'utilitaire de ligne de commande UNIX qui effectue un travail similaire.

2

Êtes-vous préoccupé par la possibilité de personnes utilisant des «nombres épelés»? (par exemple, 1-800-FLOWERS se traduit par 1-800-356-9377). Et si c'est une possibilité, comment faites-vous la distinction entre 'X' (9), ou 'x' (extension)? Je ne suis pas sûr de votre contexte, mais vous souhaiterez peut-être non seulement laisser tomber les caractères alpha en silence, mais vous souhaiterez peut-être émettre un avertissement indiquant que les numéros de téléphone alpha ne sont pas autorisés.

Cette complexité de côté, il y a quelques modules CPAN qui pourraient se révéler utiles plutôt que de rouler votre propre numéro de téléphone validateur: