Négatif regex Perl patron de la chaîne de match
J'ai cette regex:
if($string =~ m/^(Clinton|[^Bush]|Reagan)/i)
{print "$string\n"};
Je veux correspondre avec Clinton et Reagan, mais pas Bush.
Ça ne fonctionne pas.
- que faire si la chaîne commence avec aucun de ces mots?
- Ne serait pas de correspondance Clinton ou Reagan déjà dire que vous n'êtes pas de correspondance pour Bush? Ou ne correspondant pas à de Brousse, vous permettront de match Clinton ou Reagan?
- Parfois, la meilleure solution est d'éliminer la complexité en se divisant en deux expressions régulières. L'un positif, l'autre négatif.
Vous devez vous connecter pour publier un commentaire.
Exemple de texte:
Simplement en omettant un Buisson match:
Ou si vous voulez vraiment préciser:
(?!Bush)
anticipation négatif est complètement redondant dans le^(?!Bush)(Clinton|Reagan)
modèle parce que niClinton
niReagan
commencer avecBush
.Votre regex ne fonctionne pas parce que [] définit une classe de caractères, mais ce que vous voulez est un lookahead:
Essayez donc de: (?!bush)
Votre regex dit ce qui suit:
Donc, en d'autres mots, votre section du milieu de la regex vous visse jusqu'. Comme c'est un "fourre-tout" genre de groupe, il permettra à tout ligne ne commençant pas par une des lettres majuscules ou minuscules dans le "Bush". Par exemple, ces lignes correspondent à vos regex:
Vous faire un négatif "look-ahead", comme suggéré plus haut, ou tout simplement vous faire deux regexes:
Comme mirod l'a souligné dans les commentaires, le deuxième contrôle est tout à fait inutile lors de l'utilisation de l'accent circonflexe (
^
) pour correspondre qu'à partir de lignes, les lignes qui commencent par "Clinton" ou "Reagan" pourrait ne jamais commencer par "Bush".Cependant, il serait valable sans le carets.
[^Bush]
ne veut pas dire tout caractère saufB
,u
,s
ouh
. Le^
signe n'est pas une négation du caractère de remplacement. Cela implique que la suite devrait se produire au début de l'essai de la chaîne. Et depuis un^
a déjà été utilisé, je n'ai aucune idée si cela n'a aucun effet, mais certainement pas la négation 🙂[Bush]
correspond à l'un des 4 personnages B, u, s ou h, et[^Bush]
correspond à tout caractère autre que ceux 4.Quel est le problème avec l'aide de deux regexs (ou trois)? Cela rend vos intentions plus clair et peut même améliorer votre performance:
Si ma compréhension est correcte, alors vous voulez faire correspondre n'importe quelle ligne qui a Clinton et Reagan, dans n'importe quel ordre, mais pas Bush. Comme suggéré par Collé, voici une version avec les assertions avant:
Résultats
comme souhaité, elle correspond à une ligne qui a Reagan et Clinton dans n'importe quel ordre.
Vous pouvez essayer de lecture de la façon dont les assertions avant de travailler avec des exemples à http://www252.pair.com/comdog/mastering_perl/Chapters/02.advanced_regular_expressions.html
ils sont très savoureux 🙂