web-dev-qa-db-fra.com

Chaîne de correspondance RegEx ne commençant pas par my

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'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 (les énumérerai plus tard ici, désolé, pas d'accès pour le moment) mais je ne l'ai pas encore fait fonctionner.

73
Dominik Sandjaja

Vous pouvez soit utiliser une affirmation anticipée comme certains l’ont suggéré. Ou, si vous voulez simplement utiliser la syntaxe de base des expressions régulières:

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

Ceci correspond aux chaînes de 0 ou 1 caractères (^.?$) 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]).

35
Gumbo
^(?!my)\w+$

devrait marcher.

Cela garantit d'abord qu'il n'est pas possible de faire correspondre my au début de la chaîne, puis aux caractères alphanumériques jusqu'à la fin de la chaîne. Les espaces blancs n'importe où dans la chaîne feront échouer la regex. En fonction de votre entrée, vous pouvez choisir de supprimer les espaces blancs au début et à la fin de la chaîne avant de les transmettre à l'expression rationnelle, ou d'utiliser la commande add optionnelle de correspondance d'espaces, comme ^\s*(?!my)(\w+)\s*$. Dans ce cas, la référence 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, dites [A-Za-z_], Utilisez

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

Notez le passage de + À *.

141
Tim Pietzcker
/^(?!my).*/

(?!expression) est un regard négatif; il correspond à une position où expressionnon correspond à partir de cette position.

47
Amber

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 les chaînes à accepter?

/^my/
5
Victor Bruno