2010-10-17 5 views
2

Étant donné une chaîne de caractères, comment exprimer qu'un modèle doit correspondre à plusieurs expressions rationnelles en utilisant l'opérateur AND? Par exemple, je veux un mot de passe d'un minimum de 5 caractères et d'un maximum de 12 caractères.AND opérateur dans l'expression régulière?

  • Regex pour mimimum 5 caractères: .{5,}
  • Regex pour un maximum de 12 caractères: .{12}

Je sais que je peux combiner les deux ci-dessus à quelque chose comme ceci: .{5,12}, mais ce n'est pas ce J'essaie d'atteindre. Je veux "et" les deux regexes.

+0

AFAIK, (la plupart/toutes?) Les applications cela ne peut être fait (sauf pour les besoins facilement combinables comme dans votre exemple), et vous aurez juste avoir à faire défiler toutes les expressions régulières nécessaires pour vérifier si elles correspondent toutes. – Wrikken

+0

Voulez-vous dire que vous ne voulez pas d'autre choix que 5 ou 12 et rien entre les deux? AFAIK - {5,12} devrait répondre à vos besoins s'il y a quelque chose entre les deux. – Duniyadnd

+0

Etes-vous sûr de pouvoir faire {, 12}? – Max

Répondre

3

Eh bien 99% du temps, vous souhaitez soit les combiner dans la langue parente, par exemple.

if (Regex.Match(input,pattern1) && Regex.Match(input,pattern2)) 
{ 
    //do work 
} 

ou d'améliorer la regex pour les combiner, par exemple.

.{5,12} 

Si vous voulez vraiment de combiner dans un seul regex, vous pouvez utiliser regarder vers l'avenir assertions, quelque chose comme ça, mais la valeur réelle correspondance ne sera pas ce que vous pourriez attendre.

^(?=.{5,})(?=.{0,12}) 
+1

votre deuxième regex correspond également aux chaînes de plus de 12 caractères. –

+0

@colin, oui, mais c'est une faille dans l'expression rationnelle originale, pas la combinaison d'entre eux! '^. {, 12} $' fonctionnerait bien sûr. –

+2

et la deuxième partie de la regex est invalide. '{, 12}' n'est pas utilisable. –

1

Les deux expressions rationnelles source sont erronées. De toute façon, vous voulez .{5,12}.

+0

Oups, vous avez raison. Éditera. – StackOverflowNewbie

1

Si vous voulez vérifier plusieurs motifs sur une chaîne, vous pouvez utiliser un look-around:

/^(?=.{5}).{0,12}$/ 

De cette façon, vous vérifiez que votre chaîne est au moins 5 caractères, et est également au plus 12 caractères.

Mais comme vous l'avez dit, dans ce cas, il est préférable de combiner les deux dans .{5,12}.

+0

Au début, j'ai pensé que vous devriez faire {0, 7} pour la deuxième partie, mais votre réponse est correcte.+1 – Max

1

Il n'y a pas de moyen simple de le faire dans les regex eux-mêmes. Les algorithmes pour l'intersection regex que je connais exigent que vous convertissiez d'abord la regex en automate.

Dans votre cas, la meilleure solution serait probablement de créer une classe AndRegex qui combine deux regex.

0

Si vous voulez juste faire correspondre min de 5 caractères et max de 12, pourquoi même s'embêter avec regex? Vous pouvez simplement utiliser toutes les fonctions que votre langue prend en charge pour compter le nombre de caractères dans une chaîne. Par exemple, Python en utilisant len()

>>> s="mypassword" 
>>> if len(s) >=5 and len(s) <=12 : 
... print s 
... 
mypassword 

Avec Ruby

>> s="mypassword" 
=> "mypassword" 
>> s.size >= 5 and s.size<=12 
=> true