2010-06-22 9 views
0

J'ai une chaîne qui doit être validée.Expression régulière. Commence par et non égal à

Les deux premiers caractères doivent être composés A-G ou Z, mais ne peuvent pas être la combinaison suivante: GB ou ZZ. Comment est-ce que j'exprime cela dans une expression régulière?

+1

Quelle bibliothèque d'expressions régulières utilisez-vous? –

Répondre

8

Lookbehind négative est le meilleur ajustement pour cela.

[A-GZ]{2}(?<!GB)(?<!ZZ) 

Explication:

[A-GZ]{2} correspond exactement à deux personnages, qui doivent tous deux être A-G ou Z.
(?<!GB) correspond uniquement si les deux précédents caractères correspondants ne sont pas Go.
(?<!ZZ) correspond uniquement si les deux caractères précédents correspondants n'étaient pas ZZ. Le lookbehind négatif, comme toutes les opérations lookahead et lookbehind, est de largeur nulle, ce qui signifie qu'il ne change pas la position du curseur. C'est pourquoi vous pouvez enchaîner deux fois de suite comme je l'ai fait. J'aime mieux que |, car cela permet de clarifier les deux cas qui ne sont pas autorisés. Et le faire deux fois devrait avoir à peu près le même effet d'exécution que le | opérateur dans un seul lookbehind.

+4

Et aussi l'une des fonctionnalités les plus rares des expressions régulières (ne fonctionnera pas en JavaScript par exemple). Les lookaheads négatifs sont plus largement supportés et tout aussi simples: '^ (?! GB) (?! ZZ) [A-GZ] {2}' - a également ajouté le '^' puisqu'il a spécifié "les deux premiers caractères" – gnarf

+0

points gnarf. – jdmichal

+0

Que faire si les deux premiers caractères doivent être évalués séparément? [A-GZ] {1} [A-GXZ] {1} (? iBiryukov

3
^([A-F][A-GZ]|G[AC-GZ]|Z[A-G]).* 
+0

Plus compatible avec beaucoup de saveurs regexp ... ajoutez un '^' au début pour obtenir la partie 'les deux premiers caractères' de la validation ... – gnarf

+0

@gnarf Le '. *' À la fin implique qu'il s'agit d'un texte intégral match –

+0

@Michael Mrozek - Désolé, mais '^' et '$' ne sont jamais impliqués dans les langages d'expressions rationnelles que j'utilise ... Le motif ci-dessus pourrait correspondre à 'ZZ AA aasdfasd' il correspondrait seulement au' AA aasdfasd ' – gnarf

0

^([A-F] [A-GZ] | G [AC-GZ] | Z [A-G])