
Ich habe derzeit einen regulären Ausdruck für die Übereinstimmung, wenn ein String „bar“ enthält, aber nicht von „foo“ eingeleitet wird:
(?<!foo)bar
Ich möchte den regulären Ausdruck so ändern, dass er übereinstimmt, wenn eine Zeichenfolge „bar“ enthält, aber kein „foo“ und (optional) kein oder mehrere zusätzliche Zeichen vorangestellt sind.
Z. B. sollte „footestbar“ nicht übereinstimmen, da vor „bar“ „foo“ und anschließend „test“ steht.
Ich kann keine Möglichkeit finden, dies zu erreichen, da reguläre Ausdrücke die Verwendung eines Quantifizierers innerhalb eines negativen Lookbehinds nicht zulassen. Folglich kann ich Folgendes nicht tun:
(?<!foo.*)bar
Gibt es einen alternativen Ansatz?
AKTUALISIEREN:
Der reguläre Ausdruckstyp istre2. Ich prüfe derzeit die Dokumentation, habe aber auf den ersten Blick Folgendes bemerkt:
(?<!re) after text not matching re (NOT SUPPORTED)
Daher kann die Lösung keinen negativen Lookbehind verwenden (wenn ich die Dokumentation richtig interpretiere).
Antwort1
Geänderter Beitrag
Es scheint also, dass einige (die meisten?) Regex-Engines nur mit einem Lookbehind mit fester Länge funktionieren. Sie scheinen jedoch problemlos einen Lookahead mit variabler Länge zu akzeptieren. Ich bin mir nicht sicher, was Ihr Anwendungsfall dafür ist oder wie praktikabel es wäre, aber eine Idee könnte sein, Ihre Zeichenfolge umzukehren und Folgendes zu verwenden:
rab(?!.*oof)
Natürlich sieht es lächerlich aus und ich weiß nicht, wie Sie es verwenden oder wie nützlich es sein wird. Die meiste Erfahrung mit Regex habe ich mit .NET gemacht und meistens keine Lookbehinds benötigt. Nur eine Idee für Sie...!
Originalbeitrag – Funktioniert nur mit bestimmten Regex-Engines (getestet mit .NET)
Versuchen Sie den folgenden regulären Ausdruck:
(?<!foo(?:.*)?)bar
Dadurch wird eine optionale, nicht erfassende Gruppe innerhalb desselben negativen Looks dahinter hinzugefügt.