
Ich möchte eine Möglichkeit finden, alle Zeilen anzuzeigen, die ein bestimmtes Muster enthalten, die benachbarten (vorherigen, nächsten) Zeilen jedoch nicht.
Beispiel: sagen wir, Muster ist das Wort „MUSTER“
1.#########################
2.#########MUSTER##########
3.##############################
dann ist die 2. Zeile gültig und wird angezeigt.
ABER
1.#########################
2.#########MUSTER##########
3.#########MUSTER##########
4.##############################
dann sind die 2. und 3. Zeile ungültig und werden daher nicht angezeigt
Antwort1
Sie möchten Regex-Erfassungsgruppen wie folgt verwenden:
/\v%(PATTERN.*\n.*)@<!(PATTERN)%(.*\n.*\1)@!
Das mag beängstigend aussehen, ist aber eigentlich ganz einfach:
\v
wird verwendet, um"sehr magisch"Regex (vermeidet die Verwendung von Backslashes für die meisten Sonderzeichen)PATTERN.*\n.*
istPATTERN
, gefolgt von irgendetwas, einem Zeilenumbruch und wieder irgendetwas(...)@<!
ist das Muster für negatives Look-Behind: Es bedeutet, dass wirwill nichtwas zwischen den Klammern steht, muss vorhanden sein. In unserem Fall sollte also der gesamte Schritt2
nicht vorhanden sein(PATTERN)
Dies ist unser eigentliches Wort, das sollte existieren! Wir erfassen es mit Klammern für die zukünftige Verwendung.*\n.*\1
ist irgendetwas, eine neue Zeile, wieder irgendetwas und unsere erfasste Gruppe (siehe Schritt4
)%(...)@!
ist ein negativer Vorausblick, da wir wie zuvor nicht möchten, dass das, was zwischen den Klammern steht, existiert.
Im Grunde wollen wir also PATTERN
, und zwar:
- nicht von einer Zeile eingeleitet, die enthält
PATTERN
- nicht gefolgt von einer Zeile mit
PATTERN