Regulärer Ausdruck - Wenn die Zeichenfolge „bar“ enthält, aber nicht durch „foo“ eingeleitet wird

Regulärer Ausdruck - Wenn die Zeichenfolge „bar“ enthält, aber nicht durch „foo“ eingeleitet wird

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)

Bildbeschreibung hier eingeben

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.

Bildbeschreibung hier eingeben

verwandte Informationen