RegExp chaîne correspondante ne commençant pas par mon
Pour PMD, j'aimerais 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.
Donc, j'ai besoin d'une 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érents (liste ici plus tard, désolé, pas d'accès pour le moment) mais ne l'ai pas encore.
4 réponses
, Vous pouvez soit utiliser une anticipation affirmation 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ère long (^.?$
) et ne peut donc pas être my
. Ou des chaînes avec deux caractères ou plus où lorsque le premier caractère n'est pas un m
d'autres caractères peuvent suivre (^[^m].+
); ou si le premier caractère est un m
, il ne doit pas être suivi d'un y
(^m[^y]
).
^(?!my)\w+$
Devrait fonctionner.
Cela 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. Les espaces n'importe où dans la chaîne provoqueront l'échec de l'expression rationnelle. En fonction de votre entrée, vous pouvez supprimer les espaces au recto et au verso de la chaîne avant de la transmettre à l'expression rationnelle, ou utiliser des correspondants d'espaces facultatifs à l'expression rationnelle comme ^\s*(?!my)(\w+)\s*$
. Dans ce cas, backreference 1 contiendra le nom de la variable.
Et si vous devez vous assurer que votre nom de variable commence par un certain groupe de caractères, disons [A-Za-z_]
, utiliser
^(?!my)[A-Za-z_]\w*$
Remarque le changement de +
à *
.
/^(?!my).*/
(?!expression)
est un lookahead négatif; il correspond à une position où expression
ne correspond pas à à partir de cette position.
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/