web-dev-qa-db-fra.com

Comment l'opérateur AND / OR est-il représenté comme dans les expressions régulières?

Je suis en train de programmer un algorithme de vocabulaire qui vérifie si un utilisateur a correctement saisi le mot. J'ai la situation suivante: La solution correcte pour le mot serait "part1, part2". L'utilisateur doit pouvoir entrer "partie1" (réponse 1), "partie2" (réponse 2) ou "partie1, partie2" (réponse 3). J'essaie maintenant de faire correspondre la chaîne donnée par l'utilisateur avec l'expression regex suivante, créée automatiquement:

^(part1|part2)$

Cela renvoie uniquement les réponses 1 et 2 comme correctes, tandis que la réponse 3 serait fausse. Je me demande maintenant s'il existe un opérateur similaire à | qui dit and/or au lieu de either...or.

Quelqu'un peut-il m'aider à résoudre ce problème?

189
Jonathan

Je suppose que vous voulez créer une regex de manière dynamique pour contenir d'autres mots que part1 et part2, et que vous souhaitez que l'ordre soit sans importance. Si oui, vous pouvez utiliser quelque chose comme ceci:

((^|, )(part1|part2|part3))+$

Correspondances positives:

part1
part2, part1
part1, part2, part3

Correspondances négatives:

part1,           //with and without trailing spaces.
part3, part2, 
otherpart1
248
Mithon
'^(part1|part2|part1,part2)$'

est-ce que ça marche?

25
Kent

Est-ce que cela fonctionne sans alternance?

^((part)1(, \22)?)?(part2)?$

ou pourquoi pas ça?

^((part)1(, (\22))?)?(\4)?$

Le premier fonctionne pour toutes les conditions, le second pour tous sauf part2 (utilisant GNU sed 4.1.5)

5
potong

Pas un expert en regex, mais vous pouvez faire ^((part1|part2)|(part1, part2))$. En mots: "part 1 ou part2 ou les deux"

4
BlackBear

Ou vous pouvez utiliser ceci:

^(?:part[12]|(part)1,\12)$
2
FailedDev