La chaîne de correspondance RegExp ne commence pas par mon

89

Pour PMD, j'aimerais avoir une règle qui me prévient de ces vilaines variables qui commencent par my.
Cela signifie que je dois accepter toutes les variables qui ne commencent PAS par my.

Donc, j'ai 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'en ai essayé plusieurs mais je ne l'ai pas encore fait.

Dominik Sandjaja
la source
1
Je pense que cela devrait être un regard négatif en arrière (pas un regard négatif sur l'avenir).
Indrit le

Réponses:

43

Vous pouvez soit utiliser une assertion anticipée comme d'autres l'ont suggéré. Ou, si vous souhaitez simplement utiliser la syntaxe d'expression régulière de base:

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

Cela correspond aux chaînes contenant zéro ou un caractère ( ^.?$) et ne peuvent donc pas l'être my. Ou des chaînes de deux caractères ou plus où, lorsque le premier caractère n'est pas, mplus de caractères peuvent suivre ( ^[^m].+); ou si le premier caractère est un, mil ne doit pas être suivi d'un y( ^m[^y]).

Gombo
la source
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 le moment.
Dominik Sandjaja
165
^(?!my)\w+$

devrait marcher.

Il garantit d'abord qu'il n'est pas possible de faire correspondre myau début de la chaîne, puis fait correspondre les caractères alphanumériques jusqu'à la fin de la chaîne. Un espace blanc n'importe où dans la chaîne entraînera l'échec de l'expression régulière. En fonction de votre entrée, vous voudrez peut-être supprimer les espaces à l'avant et à l'arrière de la chaîne avant de la transmettre à l'expression régulière, ou utiliser ajouter des correspondances d'espaces facultatives à l'expression régulière 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 le nom de votre variable commence par un certain groupe de caractères, par exemple [A-Za-z_], utilisez

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

Notez le changement de +à *.

Tim Pietzcker
la source
59
/^(?!my).*/

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

ambre
la source
7

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/
Victor Bruno
la source
4
Ce serait plus facile MAIS il (é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 pouvait pas être "inversée".
Dominik Sandjaja