130 votes

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

Pour PMD, j'aimerais avoir une règle qui m'avertisse de ces affreuses variables qui commencent par my .
Cela signifie que je dois accepter toutes les variables qui font PAS commencer par my .

J'ai donc 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 n'ai pas encore réussi à le faire fonctionner.

1 votes

Je pense qu'en fait, cela devrait être un regard négatif derrière (et non un regard négatif devant).

223voto

Tim Pietzcker Points 146308
^(?!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 aux caractères alphanumériques jusqu'à la fin de la chaîne. Un espace blanc n'importe où dans la chaîne fera échouer la regex. En fonction de votre entrée, vous pouvez soit supprimer les espaces blancs à l'avant et à l'arrière de la chaîne de caractères avant de la passer à la regex, soit ajouter des comparateurs d'espaces blancs optionnels à la regex, par exemple ^\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_] utiliser

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

Notez le changement de + a * .

81voto

Amber Points 159296
/^(?!my).*/

(?!expression) est un lookahead négatif ; il correspond à une position où expression n'a pas match à partir de cette position.

49voto

Gumbo Points 279147

Vous pouvez soit utiliser une assertion lookahead comme d'autres l'ont suggéré. Ou, si vous voulez simplement utiliser la syntaxe de base des expressions régulières :

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

Cela correspond à des chaînes de caractères de zéro ou un caractère ( ^.?$ ) et ne peut donc pas être my . Ou des chaînes de 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] ).

8voto

Victor Bruno Points 757

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

/^my/

4 votes

Ce serait plus facile MAIS c'était (était) nécessaire pour une règle qui vérifie le code lors de la livraison à un dépôt, donc la logique ne pouvait pas être "inversée".

1voto

Dyno Hongjun Fu Points 2397

Je l'utiliserais simplement, if not var.startswith("my"): accept_it()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X