
Я хочу найти способ показать все строки, которые содержат определенный шаблон, но его соседние (предыдущие, следующие) строки не содержат.
например: допустим, шаблон — это слово «УЗОР»
1.#########################
2.#########УЗОР#########
3.##############################
то 2-я строка действительна и отображается.
НО
1.#########################
2.#########УЗОР#########
3.#########УЗОР#########
4.##############################
то 2-я и 3-я строки недействительны, поэтому не будут показаны
решение1
Вам следует использовать группы захвата регулярных выражений следующим образом:
/\v%(PATTERN.*\n.*)@<!(PATTERN)%(.*\n.*\1)@!
Это может показаться пугающим, но на самом деле все довольно просто:
\v
используется для включения"очень волшебно"регулярное выражение (избегает использования обратных косых черт для большинства специальных символов)PATTERN.*\n.*
isPATTERN
, за которым следует что-либо, новая строка и снова что-либо(...)@<!
это модель отрицательного взгляда назад: это означает, что мыне хочучто находится между скобками, чтобы существовать. Так что в нашем случае, все шаги2
не должны существовать(PATTERN)
Это наше настоящее слово, оно должно существовать! Мы фиксируем его скобками для будущего использования.*\n.*\1
что угодно, новая строка, что угодно снова, и наша захваченная группа (см. шаг4
)%(...)@!
это отрицательный взгляд вперед, как и прежде, мы не хотим, чтобы существовало то, что находится между фигурными скобками.
Итак, по сути, мы хотим PATTERN
, а именно:
- не предшествует строка, содержащая
PATTERN
- не сопровождается строкой, содержащей
PATTERN