Wie wird der UND / ODER-Operator wie in regulären Ausdrücken dargestellt?

219

Ich programmiere derzeit einen Vokabularalgorithmus, der prüft, ob ein Benutzer das Wort richtig eingegeben hat. Ich habe die folgende Situation: Die richtige Lösung für das Wort wäre "Teil1, Teil2". Der Benutzer sollte entweder "Teil1" (Antwort 1), "Teil2" (Antwort 2) oder "Teil1, Teil2" (Antwort 3) eingeben können. Ich versuche jetzt, die vom Benutzer angegebene Zeichenfolge mit dem folgenden automatisch erstellten regulären Ausdruck abzustimmen:

^(part1|part2)$

Dies gibt nur Antwort 1 und 2 als richtig zurück, während Antwort 3 falsch wäre. Ich frage mich jetzt, ob es einen Operator ähnlich | gibt das heißt and/orstatt either...or.

Kann mir jemand helfen, dieses Problem zu lösen?

Jonathan
quelle
1
Reguläre Ausdrücke sind möglicherweise nicht die beste Lösung dafür. Ich würde normale String-Methoden verwenden.
Felix Kling
3
Dieses Problem ist schlecht spezifiziert. Warum verwenden Sie den Mustervergleich, wenn Sie lediglich einen genauen Zeichenfolgenvergleich mit einer Reihe legaler Zeichenfolgen benötigen? Sofern Ihr Regex-Compiler nicht wie Perl Alternativen in eine O (1) -Trie-Struktur optimiert, sollten Sie stattdessen wahrscheinlich einen Test gegen die Hash-Mitgliedschaft durchführen. Andere Regex-Motoren sind dabei einfach nicht sehr schlau.
Tchrist
@tchrist Der Anwendungsfall könnte ein Mongodb $orRegex Match sein
Nadir Abbas

Antworten:

283

Ich gehe davon aus, dass Sie den regulären Ausdruck dynamisch erstellen möchten, um andere Wörter als Teil1 und Teil2 zu enthalten, und dass die Reihenfolge keine Rolle spielen soll. Wenn ja, können Sie so etwas verwenden:

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

Positive Übereinstimmungen:

part1
part2, part1
part1, part2, part3

Negative Übereinstimmungen:

part1,           //with and without trailing spaces.
part3, part2, 
otherpart1
Gaute Løken
quelle
4
Beachten Sie, dass "Teil1, Teil" 1 ebenfalls positiv ist. Was nicht immer wünschenswert ist
Dimaaan
1
@dimaaan Hast du deine Zitate falsch platziert? "Teil1, Teil1" wird eine Übereinstimmung sein, "Teil1, Teil" jedoch nicht. Obwohl Sie richtig sind, dass ein solches Szenario von dieser Lösung nicht abgedeckt wird, glaube ich, dass er für die Anwendung des OP, bei dem er prüft, ob die Testzeichenfolge aus Wörtern in einem Vokabular besteht, eine positive Übereinstimmung wünscht, selbst wenn es sich um ein Wort handelt wiederholt. Das Wort wird immer noch Teil des Wortschatzes sein, egal wie viele Instanzen davon Sie haben.
Gaute Løken
30
'^(part1|part2|part1,part2)$'

funktioniert es?

Kent
quelle
1
Offensichtlich. Die Regex erfordert, dass die gesamte Zeichenfolge übereinstimmt (^, $)
Glaspille
5

Funktioniert das ohne Abwechslung?

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

oder warum nicht das?

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

Die erste funktioniert für alle Bedingungen, die zweite für alle außer part2(mit GNU sed 4.1.5)

Potong
quelle
4

Kein Experte für Regex, aber Sie können es tun ^((part1|part2)|(part1, part2))$. In Worten: "Teil 1 oder Teil 2 oder beides"

Schwarzbär
quelle
2

Oder Sie können dies verwenden:

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