Ich habe eine Liste von Zeichenfolgen. Einige von ihnen haben die Form 123-...456
. Der variable Teil "..." kann sein:
- die Zeichenfolge "Apfel" gefolgt von einem Bindestrich, z
123-apple-456
- die Zeichenfolge "Banane" gefolgt von einem Bindestrich, z
123-banana-456
- eine leere Zeichenfolge, z. B.
123-456
(beachten Sie, dass es nur einen Bindestrich gibt)
Jedes andere Wort als "Apfel" oder "Banane" ist ungültig.
Für diese drei Fälle möchte ich "Apfel", "Banane" bzw. "" zuordnen. Beachten Sie, dass ich will nie erfassen den Bindestrich, aber ich will immer passen es. Wenn die Zeichenfolge nicht die 123-...456
oben beschriebene Form hat, gibt es überhaupt keine Übereinstimmung.
Wie schreibe ich dazu einen regulären Ausdruck? Angenommen, ich habe einen Geschmack, der Lookahead-, Lookbehind-, Lookaround- und nicht erfassende Gruppen zulässt.
Die wichtigste Beobachtung hier ist, dass Sie, wenn Sie entweder "Apfel" oder "Banane" haben, auch den nachgestellten Bindestrich haben müssen, aber nicht damit übereinstimmen möchten. Und wenn Sie mit der leeren Zeichenfolge übereinstimmen, darf der nachfolgende Bindestrich nicht vorhanden sein. Ein regulärer Ausdruck, der diese Behauptung zusammenfasst, wird meiner Meinung nach der richtige sein.
Antworten:
Die einzige Möglichkeit, etwas nicht zu erfassen, besteht darin, sich umzuschauen :
Denn selbst bei nicht erfassenden Gruppen
(?:…)
erfasst der gesamte reguläre Ausdruck den übereinstimmenden Inhalt. Dieser reguläre Ausdruck stimmt jedoch nur übereinapple
oderbanana
wenn ihm vorangestellt123-
und gefolgt wird-456
, oder er stimmt mit der leeren Zeichenfolge überein, wenn ihm vorangestellt123-
und gefolgt wird456
.quelle
Update: Danke an Germán Rodríguez Herrera!
In Javascript versuchen Sie:
/123-(apple(?=-)|banana(?=-)|(?!-))-?456/
Denken Sie daran, dass das Ergebnis in Gruppe 1 ist
Debuggex-Demo
quelle
Versuchen:
Das wird passen
apple
,banana
oder eine leere Zeichenfolge, und nach ihm wird es ein 0 oder 1 Bindestrich sein. Ich habe mich geirrt, weil ich keine Erfassungsgruppe brauchte. Wie dumm von mir.quelle
Ich habe eine der Antworten geändert (von @ op1ekun):
Der Grund ist, dass die Antwort von @ op1ekun auch übereinstimmt
"123-apple456"
, ohne den Bindestrich nach Apfel.quelle
Versuche dies:
quelle
apple
oderbanana
oder "". Alle anderen Werte sind ungültig, wie ich bereits sagte.Eine Variation des Ausdrucks von @Gumbo, die
\K
zum Zurücksetzen von Übereinstimmungspositionen verwendet wird, um die Einbeziehung von Zahlenblöcken in die Übereinstimmung zu verhindern. Verwendbar in PCRE-Regex-Geschmacksrichtungen.Streichhölzer:
quelle
Bei weitem das einfachste (funktioniert für Python) ist
'123-(apple|banana)-?456'
.quelle
123-apple456
so dass es nicht korrekt ist.