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.
regex
regex-negation
pmd
Dominik Sandjaja
la source
la source
Réponses:
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'êtremy
. Ou des chaînes de deux caractères ou plus où, lorsque le premier caractère n'est pas,m
plus de caractères peuvent suivre (^[^m].+
); ou si le premier caractère est un,m
il ne doit pas être suivi d'uny
(^m[^y]
).la source
^(?!my)\w+$
devrait marcher.
Il garantit d'abord qu'il n'est pas possible de faire correspondre
my
au 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
+
à*
.la source
/^(?!my).*/
(?!expression)
est une anticipation négative; il correspond à une position oùexpression
ne correspond pas à partir de cette position.la source
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/
la source