Соответствие регулярного выражения Vim с lookahead и суффиксом без уничтожения поведения lookahead - PullRequest
0 голосов
/ 30 апреля 2018

Подумайте о двух разных совпадениях в vim Образец 1. syn match match1 / \ $ [^ $] + \ $ / Совпадение $foo$, $bar$, $123$ Образец 2. syn match match2 / (\ w + \ | (\ $ [^ \ $] + \ $) \ @ =) + __ / Я хочу, чтобы это соответствовало foo$bar$__, но не $bar$ Проблема в том, что Pattern1 будет конфликтовать с Pattern2. Я пытаюсь использовать Положительный Lookahead, чтобы обойти Pattern1 в Pattern2, но префикс __ (двойное подчеркивание) разрушает поведение позитивного взгляда. Как мне решить эту проблему? или я что-то не так делаю!?


Обновление:

Извините за плохое объяснение.

Шаблон 1 соответствует любой строке, окруженной двумя знаками доллара

syn match match1 /\$[^$ ]\+\$/
-> $foo$, $bar$

Шаблон 2 соответствует любому концу строки с двойным подчеркиванием, НО все еще соответствует, но исключает любую строку, которая соответствует шаблону 1.

syn match match2 /\(\w\+\|\(\$[^\$]\+\$\)\@=\)\+__/
-> hello__, world__

, поэтому проблема в том, что я добавляю любую строку, связанную с шаблоном 1

hello$foo$__

в этом случае. Я хочу привет И __ сопоставить с шаблоном 1 (Непрерывно)

но пусть $ foo $ совпадает с шаблоном 2.

1 Ответ

0 голосов
/ 02 мая 2018

Не думаю, что вы понимаете, что делает заглядывание. Похоже, что вы пытаетесь сопоставить строку, но пропустите ее:

foo$bar$___
^^^~~~~~^^^

... где части, отмеченные ^ образуют соответствие (прерывистые), а части, отмеченные ~, пропускаются.

Это невозможно с регулярным выражением. Регулярное выражение всегда соответствует непрерывному фрагменту строки.

Что делает Lookahead, так это то, что он позволяет вам «заглянуть вперед»: он, как обычно, соответствует под Регламенту, но не перемещает текущую позицию в строке. В зависимости от того, куда вы поместили заголовок, это позволяет вам либо проверять текст после конца совпадения, либо удостовериться, что одна и та же строка соответствует двум регулярным выражениям одновременно (хотя последнее также можно сделать с помощью \& в vim).

Пример:

\%(foo\)\@=bar

Это никогда не может совпадать. Требуется, чтобы следующие три символа были одновременно foo и bar, что невозможно.


Я думаю, что вы ищете перекрывающиеся спички. Vim поддерживает это напрямую:

syn match match1 /\$[^$ ]\+\$/
syn match match2 /\%(\w\|\$[^$ ]\+\$\)\+__/ contains=match1

Здесь мы говорим, что совпадения match2 могут содержать совпадения match1. Это дает вам подсветку, которую вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...