1
votes

Expression régulière pour correspondre à la chaîne entière contenant un sous-ensemble

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


2 commentaires

Cela résoudrait-il votre problème? ~. * (toto | bar). * (toto | bar). * ~ ims


Il doit avoir au moins un toto et au moins une barre


3 Réponses :


2
votes

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

Démo: https://regex101.com/r/3SQhg2/4


3 commentaires

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.



1
votes

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
)
$

https://regex101.com/r / 3wzFh3 / 2


1 commentaires

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



1
votes

Essayez cette expression régulière:

^(?=.*\bfoo\b)(?=.*\bbar\b)(.*)$

Cliquez pour Démo

  • ^ - 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.


1 commentaires

Celui-ci prend le gâteau. Pas de répétition de l'ordre inversé.