RegEx Exclure Appariés Modèles
J'ai le dessous des modèles à exclure.
make it cheaper
make it cheapere
makeitcheaper.com.au
makeitcheaper
making it cheaper
www.make it cheaper
ww.make it cheaper.com
J'ai créé une expression régulière pour rechercher l'un de ces. Cependant, je veux être tout autre que ces. Je ne suis pas sûr de savoir comment à l'inverse de cette regex que j'ai créé.
mak(e|ing) ?it ?cheaper
Schéma ci-dessus correspond à toutes les chaînes répertoriées. Maintenant, je veux correspondre avec tout le reste. Comment dois-je faire?
De la recherche, il semble que j'ai besoin de quelque chose comme d'anticipation négatif /regarder en arrière. Mais, je n'ai pas vraiment l'obtenir. Peut quelqu'un me pointer dans la bonne direction?
OriginalL'auteur San | 2013-08-14
Vous devez vous connecter pour publier un commentaire.
Vous pouvez juste le mettre dans un négatif look-ahead comme suit:
Juste comme ça ne va pas fonctionner, cependant, car si vous faites un
matches
1, qu'il ne correspond pas puisque vous êtes simplement à la recherche à l'avance, vous n'êtes pas réellement de correspondance de rien, et, si vous faites unfind
1, elle va trouver de nombreuses fois, car vous pouvez commencer à partir de plusieurs endroits dans la chaîne où les caractères suivants ne correspond pas à la ci-dessus.Pour résoudre ce problème, en fonction de ce que vous voulez faire, nous avons 2 choix:
Si vous souhaitez exclure toutes les chaînes qui sont exactement l'un de ceux-là (c'est à dire "faire cheaperblahblah" n'est pas exclue), vérifier pour commencer (
^
) et la fin ($
) de la chaîne:La
.*
(zéro ou plus de wild-cards) est le correspondant. Le négatif look-ahead vérifie à partir du premier caractère.Si vous souhaitez exclure toutes les chaînes contenant l'un de ces, vous pouvez assurez-vous que le regard n'est pas correspondu avant chaque personnage nous match:
Une alternative est d'ajouter des wild-cards pour le début de votre "look-ahead" (c'est à dire d'exclure toutes les chaînes que, depuis le début de la chaîne, contiennent quelque chose, alors votre modèle), mais je ne vois actuellement aucun avantage à ce (longueur arbitraire look-ahead " est également moins susceptibles d'être pris en charge par n'importe quel outil):
En raison de la
^
et$
, soit faire unfind
ou unmatches
de travail pour l'une des ci-dessus (bien que, dans le cas dematches
, le^
est facultative et, dans le cas defind
, le.*
en dehors du look-ahead " est facultatif).1: Bien qu'ils ne peuvent être appelés que de nombreuses langues, ont des fonctions équivalentes à
matches
etfind
avec la regex.Ci-dessus est strictement regex réponse à cette question.
Une meilleure approche pourrait être de s'en tenir à l'original regex (
mak(e|ing) ?it ?cheaper
) et voir si vous pouvez annuler les matches directement avec l'outil ou la langue que vous utilisez.En Java, par exemple, il serait nécessaire de faire
if (!string.matches(originalRegex))
(note de l'!
, qui réduit à néant l'retourné boolean) au lieu deif (string.matches(negLookRegex))
.OriginalL'auteur Dukeling
L'anticipation négatif, je crois que c'est ce que vous cherchez. Peut-être essayer:
Et peut-être un peu plus souple:
Juste au cas où il y a plus d'un espace.
OriginalL'auteur Jerry