2010-01-22 10 views
47

Pour PMD je voudrais avoir une règle qui me prévient de ces variables laides qui commencent par mon. Cela signifie que je dois accepter toutes les variables qui ne commencent pas par mon.RegExp chaîne correspondant pas en commençant par mon

Alors, je besoin d'un RegEx (re) qui se comporte comme suit:

re.match('myVar')  == false 
re.match('manager')  == true 
re.match('thisIsMyVar') == true 
re.match('myOtherVar') == false 
re.match('stuff')  == true 

J'ai essayé différentes les (leur liste ici plus tard, désolé, pas d'accès à eux en ce moment), mais havre de paix » Je n'ai pas encore travaillé.

+1

Je pense que cela devrait effectivement être un regard négatif derrière (pas un regard négatif à venir). – Indrit

Répondre

31

Vous pouvez utiliser une assertion lookahead comme d'autres l'ont suggéré. Ou, si vous voulez juste utiliser la syntaxe d'expression régulière de base:

^(.?$|[^m].+|m[^y].*) 

Cela correspond à des chaînes qui sont soit zéro ou un caractères (^.?$) et ne peut donc être my. Ou des chaînes avec deux caractères ou plus où lorsque le premier caractère n'est plus m, d'autres caractères peuvent suivre (^[^m].+); ou si le premier caractère est m, il ne doit pas être suivi d'un y (^m[^y]).

+0

C'est celui que nous pourrions utiliser maintenant. On dirait qu'il y a un problème avec l'expression rationnelle étendue, mais celle-ci fonctionne bien pour l'instant. –

103
^(?!my)\w+$ 

devrait fonctionner.

Il s'assure d'abord qu'il n'est pas possible de faire correspondre my au début de la chaîne, puis correspond à des caractères alphanumériques jusqu'à la fin de la chaîne. Les espaces vides dans la chaîne entraîneront l'échec de l'expression régulière. En fonction de votre entrée, vous pouvez soit supprimer les espaces avant et arrière de la chaîne avant de la passer à l'expression rationnelle, soit utiliser l'option Ajouter des correspondances d'espaces optionnels à la regex comme ^\s*(?!my)(\w+)\s*$. Dans ce cas, la référence arrière 1 contiendra le nom de la variable.

Et si vous devez vous assurer que votre nom de variable commence par un certain groupe de personnages, disent [A-Za-z_], utilisez

^(?!my)[A-Za-z_]\w*$ 

Notez le changement +-*.

34
/^(?!my).*/ 

(?!expression) est une préanalyse négative; il correspond à une position où ne correspond pas à partir de cette position.

5

Ne serait-il pas beaucoup plus lisible de faire une correspondance positive et de rejeter ces chaînes - plutôt que de faire correspondre le négatif pour trouver des chaînes à accepter?

/^my/ 
+2

Cela serait plus facile MAIS cela (était) nécessaire pour une règle qui vérifie le code lors de la validation dans un référentiel, donc la logique ne peut pas être "annulée". –