Mes exigences sont légèrement différentes en ce sens que j'en ai besoin pour renvoyer vrai si AUCUN mot / phrase n'est trouvé (les exemples existants retournent vrai si tous sont trouvés).
Je voudrais utiliser une expression régulière pour vérifier une chaîne afin de voir si tous les mots / phrases d'une liste sont dans la chaîne principale.
Le problème est que je veux qu'elle renvoie une chaîne si l'un des mots de la liste est manquant.
par exemple Liste de mots / expressions
chat
gros chien
Ce gros chien et ce chat sont allés en ville. (Ne devrait rien renvoyer car les deux mots ont été trouvés)
Le chien et le chat sont allés en ville. (devrait renvoyer une chaîne car "big dog" n'est pas dans la chaîne)
Je ne suis pas trop préoccupé par ce qui est retourné (bien que ma préférence serait que le mot / la phrase non trouvé soit retourné. Sinon, il peut simplement renvoyer la chaîne d'origine).
La principale exigence est qu'une chaîne soit retournée si l'un des mots de la liste n'est pas trouvé.
J'ai essayé quelque chose similaire à ce qui suit:
^(?!.*(BIG DOG|CAT)).*$
Malheureusement, cela ne fonctionne pas car il renvoie la chaîne si tous les mots sont manquants. J'en ai besoin pour ne revenir que s'il manque un mot / une phrase.
3 Réponses :
Votre tentative actuelle n'est pas si éloignée, et les lookaheads sont un moyen de le faire:
^(?=.*\bbig dog\b)(?=.*\bcat\b).*$
Cela ne retournerait vrai que si big dog et cat sont présents sont des termes / mots autonomes. Notez que vous souhaiterez peut-être l'exécuter en mode insensible à la casse. La syntaxe exacte que vous utiliseriez dépendrait de votre langage de programmation (ce que vous ne nous avez jamais dit).
Merci pour la réponse rapide. J'ai essayé cela auparavant. Le problème est que je dois retourner true si un mot est manquant (dans ce cas, il retourne true si tous les mots sont trouvés). Y a-t-il de toute façon pour nier (j'espère que c'est le terme correct) les résultats.
@SanjaySingh Mon expression régulière est uniquement si tous les termes sont présents. Donc, si ce n'est pas vrai, il en manque un ou plusieurs. Cela répond à vos exigences AFAIK.
Merci Tim. Le contexte suivant peut expliquer un peu mieux mes besoins. J'essaye d'utiliser ceci dans un programme existant sans changer le code existant. Le code est déclenché si quelque chose est retourné par le regex saisi par l'utilisateur. Dans ce cas, la condition est de déclencher si l'une des phrases est manquante. Si toutes les phrases sont là, rien ne doit être renvoyé et le code ne sera donc pas déclenché.
Encore une fois ... mon modèle détecte si tous les termes sont présents ou non, alors qu'est-ce qui ne va pas avec ma réponse?
Salut Tim. Je suis très reconnaissant de votre réponse. Le seul problème était que je ne pouvais pas utiliser le RegX tel quel sans avoir à changer le code de mon logiciel. J'avais besoin de vrai pour être retourné si un terme manquait. Votre réponse était vraie si tous les termes étaient trouvés. Merci encore d'avoir pris le temps de répondre.
Je suppose que cette expression pourrait être proche de celle souhaitée:
^(?!(?=.*\bcat\b)(?=.*\bbig\s+dog\b).*)(?=.*\b(big\s+dog|cat)\b).*$
Si vous souhaitez explorer / simplifier / modifier l'expression, c'est expliqué dans le panneau supérieur droit de regex101.com . Si tu veux, tu peut également regarder en ce lien , comment il correspondrait contre quelques exemples d'entrées.
Ça a marché. J'ai simplifié comme suit et ajouté (? I) pour rendre insensible à la casse.Merci! ^ (?! (? i) (? =. * \ bcat \ b) (? =. * \ bbig \? chien \ b). *). * $
Vous pouvez utiliser des lookarounds avec un alternance pour vérifier si l'un est présent et l'autre ne doit pas l'être.
^(?:(?=.*\bbig dog\b)(?!.*\bcat\b)|(?!.*\bbig dog\b)(?=.*\bcat\b)).+$
Explication
^ Début de chaîne (?: Groupe sans capture
(? =. * \ bbig dog \ b) Affirmer que big dog est présent (?!. * \ bcat \ b) Assert cat n'est pas | Ou (?!. * \ bbig dog \ b) Affirmer que big dog n'est pas présent (? =. * \ bcat \ b) Assert cat est ) Fermer le groupe . + Faites correspondre plus de 1 caractère à n'importe quel caractère pour éviter de faire correspondre une chaîne vide $ Fin de chaîne