J'ai une bonne maîtrise de l'expression régulière, mais voici une chose avec laquelle j'ai des problèmes.
J'ai cette chaîne:
(?=foo|bar)[^\s]+
Je veux faire correspondre le TOUT string UNIQUEMENT si foo AND bar est dessus quel que soit l'ordre.
J'ai ceci jusqu'à présent, mais je dois capturer la chaîne entière:
foo xxx bar z
3 Réponses :
Ce dont vous avez besoin est quelque chose comme ceci:
^.*\bfoo\b.*bar\b.*$|^.*\bbar\b.*foo\b.*$
Démo: https://regex101.com/r/3SQhg2/1
Edit: j'ai raté le point que les foo
et bar code> doit apparaître comme un mot entier. Voici la solution:
Pour la commande foo -> bar
^.*\bbar\b.*foo\b.*$
Pour la barre de commande -> foo (en échangeant simplement foo et
bar
dans le précédent)
^.*\bfoo\b.*bar\b.*$
Les deux combinés:
(.*foo.+bar.*)|(.*bar.+foo.*)
Je pense qu'OP ne veut pas que cela corresponde à aa foobb bar
@choz Vous avez raison. Merci de l'avoir signalé! J'ai amélioré ma réponse.
Nous avons pensé la même chose. Mais j'ai accepté la réponse de Potato parce qu'elle est plus courte et n'a pas l'expression régulière en miroir / répétée. Merci.
J'ai compris, je voulais supprimer ceci, mais peut-être que quelqu'un d'autre posera cette question aussi, alors je posterai aussi ma réponse ici.
xx bar xfoo
Quels correspondances + capture :
aa foobb bar
et
yy bar z foo xxx
mais pas
foo xxx bar z
et
^ ( # let's start capturing .* # if there's something before the two words (?: (?=\bfoo\b)\w+ # match the first word .* # if there's something in the middle of the two words (?=\bbar\b)\w+ # match the second word | # OR let's do everything above but in reverse this time (?=\bbar\b)\w+ .* (?=\bfoo\b)\w+ ) .* # if there's something after the two words ) $
l'ajout de beaucoup de anticipations positives
peut entraîner une surcharge. Vous pouvez comparer les résultats ici: regex101.com/r/3wzFh3/3 et ici regex101.com/r/3wzFh3/4 (Voir la section des résultats en haut à droite dans le zone verte.)
Essayez cette expression régulière:
^(?=.*\bfoo\b)(?=.*\bbar\b)(.*)$
^
- affirme le début de la ligne (? =. * \ bfoo \ b)
- recherche positive pour s'assurer que la ligne courante contient le mot foo
entouré de limites de mots. li >
(? =. * \ bbar \ b)
- recherche positive pour s'assurer que la ligne courante contient le mot bar
entouré de limites de mots. li >
(. *)
- correspond et capture plus de 0 occurrences de n'importe quel caractère sauf un caractère de nouvelle ligne. $
- affirme la fin de la ligne. Celui-ci prend le gâteau. Pas de répétition de l'ordre inversé.
Cela résoudrait-il votre problème?
~. * (toto | bar). * (toto | bar). * ~ ims
Il doit avoir au moins un
toto
et au moins unebarre