it-swarm.com.de

Wie wird der AND / OR-Operator in regulären Ausdrücken dargestellt?

Ich programmiere gerade einen Vokabularalgorithmus, der überprü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 nun, die vom Benutzer angegebene Zeichenfolge mit dem folgenden, automatisch erstellten regulären Ausdruck abzugleichen:

^(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 dem von | gibt das sagt and/or anstelle von either...or.

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

189
Jonathan

Ich gehe davon aus, dass Sie einen regulären Ausdruck dynamisch erstellen möchten, der andere Wörter als Teil1 und Teil2 enthält, und dass Sie möchten, dass die Reihenfolge keine Rolle spielt. In diesem Fall können Sie Folgendes verwenden:

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

Positive Übereinstimmungen:

part1
part2, part1
part1, part2, part3

Negative Übereinstimmungen:

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

funktioniert es?

25
Kent

Funktioniert das ohne Abwechslung?

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

oder warum nicht?

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

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

5
potong

Kein Regex-Experte, aber Sie können ^((part1|part2)|(part1, part2))$ ausführen. In Worten: "Teil 1 oder Teil 2 oder beides"

4
BlackBear

Oder Sie können dies verwenden:

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