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.

57
demandé sur Dominik Sandjaja 2010-01-22 12:44:19

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]).

32
répondu Gumbo 2010-01-22 10:09:43
^(?!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 + à *.

117
répondu Tim Pietzcker 2010-01-22 10:50:09
/^(?!my).*/

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

41
répondu Amber 2010-01-22 09:49:35

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/
5
répondu Victor Bruno 2011-09-12 16:34:27