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

219

Je programme actuellement un algorithme de vocabulaire qui vérifie si un utilisateur a correctement tapé le mot. J'ai la situation suivante: La solution correcte pour le mot serait "part1, part2". L'utilisateur doit être en mesure de saisir "partie 1" (réponse 1), "partie 2" (réponse 2) ou "partie 1, partie 2" (réponse 3). J'essaie maintenant de faire correspondre la chaîne donnée par l'utilisateur avec l'expression de regex suivante, créée automatiquement:

^(part1|part2)$

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

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

Jonathan
la source
1
Les expressions régulières ne sont peut-être pas la meilleure solution pour cela. J'utiliserais des méthodes de chaîne normales.
Felix Kling
3
Ce problème est mal spécifié. Pourquoi utilisez-vous la correspondance de modèles alors que tout ce dont vous avez besoin est une comparaison exacte de chaînes avec un ensemble de chaînes légales? À moins que votre compilateur regex optimise les alternatives dans une structure de tri O (1) comme Perl le fait, vous devriez probablement faire un test contre l'appartenance au hachage à la place. D'autres moteurs regex ne sont tout simplement pas très intelligents à ce sujet.
tchrist
@tchrist Le cas d'utilisation pourrait être un $ormatch de mongodb regex
Nadir Abbas

Réponses:

283

Je vais supposer que vous voulez construire un regex dynamiquement pour contenir d'autres mots que part1 et part2, et que vous voulez que l'ordre n'ait pas d'importance. Si oui, vous pouvez utiliser quelque chose comme ceci:

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

Matchs positifs:

part1
part2, part1
part1, part2, part3

Correspondances négatives:

part1,           //with and without trailing spaces.
part3, part2, 
otherpart1
Gaute Løken
la source
4
Notez que "part1, part" 1 sera également positif. Ce qui n'est pas toujours souhaitable
dimaaan
1
@dimaaan Avez-vous égaré vos citations? "part1, part1" sera une correspondance, mais "part1, part" ne le sera pas. Bien que vous ayez raison de dire qu'un tel scénario n'est pas couvert par cette solution, pour l'application de l'OP où il vérifie si la chaîne de test se compose de mots dans un vocabulaire, je pense qu'il veut une correspondance positive même lorsqu'un mot est répété. Le mot fera toujours partie du vocabulaire, peu importe le nombre d'instances qu'il contient.
Gaute Løken
30
'^(part1|part2|part1,part2)$'

est-ce que ça marche?

Kent
la source
1
Évidemment. l'expression régulière requiert que toute la chaîne corresponde (^, $)
glasspill
5

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, mais part2(en utilisant GNU sed 4.1.5)

potong
la source
4

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

Ours noir
la source
2

Ou vous pouvez utiliser ceci:

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