Bitte nicht folgen!
Gelegentlich stehe ich vor dem Problem, Aussagen der Form k nicht gefolgt von x als regulären Ausdruck und dann noch in der komplexeren Form abc nicht gefolgt von xyz formulieren zu wollen.
Negative Character-Klassen sind keine Hilfe
Negative Character-Klassen in der Art k[^x] lassen sich dafür aber nicht verwenden, da sie etwas anderes ausdrücken. Sie bedeuten eben nicht: k nicht gefolgt von x, sondern: k gefolgt von einem Character der nicht x ist.
Ein Match von k[^x] auf Linkwerk_ist_super liefert tatsächlich als Ergebnis: Linkwerk_ist_super, was nicht dem gewünschten Ergebnis
»k«
entspricht. Die Character
»'w'«
und
»'_'«
werden zusätzlich gematched da sie den Character die nicht x sind entsprechen.
Des Rätsels Lösung: Dokumentation lesen hilft gelegentlich
Als das Problem dann kürzlich wieder an Bedeutung gewann, habe ich nochmal genauer in die Dokumentation gesehen (ein durchaus empfehlenswerter Vorgang) und wurde fündig:
Des Rätsels Lösung: der zero-width negative lookahead (mal ehrlich - Hand hoch, wer es schon wusste!).
Vermutlich führte das Wort negative in meinen bisherigen Recherchen zur falschen Assoziation "rückwärts lesen". In der Tat stehen dafür ebenfalls Konstrukte zur Verfügung, richtigerweise aber als lookbehinds bezeichnet.
Die lookaheads und lookbehinds werden auch zero-width lookarounds oder zero-width assertions genannt.
Sie arbeiten auf Character-Basis und liefern als Ergebnis: matched oder matched nicht. Ein wichtiges Merkmal der lookarounds ist also, dass sie keine Character konsumieren.
Der zero-width negative lookahead hat die Form:
(?!regular_expression)
Unser gewünschter Ausdruck zu k nicht gefolgt von x lautet demnach:
k(?!x)
