2009-11-15 8 views
2

Je veux correspondre à un numéro de téléphone qui peut avoir des lettres et un trait d'union:Expression régulière correspondant au numéro de téléphone?

  • Ceci est valable: 333-WELL
  • Ceci est également valable: 4URGENT

En d'autres termes, il peut être au plus un trait d'union mais s'il n'y a pas de trait d'union, il peut y avoir au maximum sept caractères 0-9 ou AZ.

Je ne sais pas comment faire et "if instruction" dans une regex. Est-ce que c'est possible?

+0

Une réponse a été acceptée, mais j'aimerais savoir: Est-ce que ce trait d'union peut être n'importe où dans le numéro, ou doit-il toujours être entre (le cas échéant) entre le troisième et le quatrième chiffre? –

+0

Y a-t-il une raison pour laquelle vous avez besoin d'utiliser une regex? – voyager

+1

@Carl Smotricz: ça peut être n'importe où. bonne question. – sivabudh

Répondre

4

Vous cherchez l'opérateur d'alternance, indiqué par barre verticale: |

Cependant, vous devrez peut-être soit 7 alternatives (1 pour chaque emplacement de trait d'union + 1 sans trait d'union), ou vous pouvez exiger le trait d'union entre le 3 et 4ème caractère et utilisez 2 alternatives.

Une utilisation de l'opérateur d'alternance définit deux alternatives, comme dans:

({3,3}[0-9A-Za-z]-{4,4}[0-9A-Za-z]|{7,7}[0-9A-Za-z]) 
+1

merci de m'avoir montré le chemin! – sivabudh

0

Merci Heath Hunnicutt pour son opérateur alternance réponse ainsi que me montrant un exemple.

Sur la base de ses conseils, voici ma réponse:

[A-Z0-9]{7}|[A-Z0-9][A-Z0-9-]{7} 

Note: Je l'ai testé mon regex here. (Tout compris cela pour référence)

+1

Ceci considérera '0 ------' comme valide. – jason

+0

woops..mon mauvais. Merci! hmm..je me demande comment y remédier. – sivabudh

5

Je pense que cela devrait le faire:

/^[a-zA-Z0-9]{3}-?[a-zA-Z0-9]{4}$/ 

Il correspond à 3 lettres ou chiffres suivis d'un trait d'union suivi de 4 lettres ou des chiffres. Celui-ci fonctionne en rubis. Selon le moteur regex que vous utilisez, vous devrez peut-être le modifier légèrement.

+0

J'ai une question .. J'ai donc testé l'expression ci-dessus, et ça fonctionne bien. cependant, quand j'ajoute plus de chiffres à la fin, le validateur de regex dit toujours que c'est valide. pourquoi donc? Ne devrais pas l'expression devenir invalide dès que j'ajoute 1 caractère de plus? je teste à http://tools.netshiftmedia.com/regexlibrary/ en utilisant 121333333 – sivabudh

+0

+1 pour la simplicité –

+2

@ ShaChris23 parce que 121333333 correspond également au début. Pour une correspondance pleine longueur réelle, ce serait '/^[a-zA-Z0-9] {3} -? [A-zA-Z0-9] {4} $ /' (utilisez les touches '^' et ' $ 'symboles pour indiquer le début de la chaîne et la fin de la chaîne (respectivement)) –

1

Je ne sais pas si cela compte, mais je brisaient en deux regexes:

#!/usr/bin/perl 

use strict; 
use warnings; 

my $text = '333-URGE'; 

print "Format OK\n" if $text =~ m/^[\dA-Z]{1,6}-?[\dA-Z]{1,6}$/; 
print "Length OK\n" if $text =~ m/^(?:[\dA-Z]{7}|[\dA-Z-]{8})$/; 

Cela devrait éviter d'accepter plusieurs tirets, des tirets au mauvais endroit, etc ...

1

que Supposant vous voulez autoriser le trait d'union à être n'importe où, lookarounds vous sera utile. Quelque chose comme ceci:

^([A-Z0-9]{7}|(?=^[^-]+-[^-]+$)[A-Z0-9-]{8})$ 

Il y a deux parties principales à ce modèle: [A-Z0-9]{7} pour correspondre à une chaîne sans trait d'union et (?=^[^-]+-[^-]+$)[A-Z0-9-]{8} pour correspondre à une chaîne césure.

Le (?=^[^-]+-[^-]+$) sera match pour une chaîne avec un trait d'union dans UNIQUE (et le trait d'union n'est pas le premier ou le dernier caractère), alors la partie [A-Z0-9-]{8} comptera les personnages et assurez-vous qu'ils sont tous valides.

+1

Note: J'ai révisé ma réponse après avoir testé la regex. – Artelius

+1

wow, c'est génial. Merci! – sivabudh

Questions connexes