Sublime Syntax Regex Только выделение совпадений в разделителях

Я хотел бы сопоставить строку с регулярными выражениями, которые встречаются внутри указанных разделителей, но не сами разделители, с целью подсветки синтаксиса в пакете Sublime Text. У меня СТ3.

Например, в пакете sublime-notes этот элемент <dict> используется для сопоставления текста между < и >, включая сами угловые скобки, что приводит к выделению <this>, а не только ‹this>.

<dict>
    <key>comment</key>
    <string>Important, surrounded by &lt;...&gt;</string>
    <key>match</key>
    <string>(\&lt;[^\&gt;]*\&gt;)</string>
    <key>name</key>
    <string>constant.other.date.notes</string>
</dict>

Как я могу изменить регулярное выражение между тегами <string>, чтобы не включать угловые скобки в подсветку синтаксиса?


person tsouchlarakis    schedule 07.05.2018    source источник
comment
Попробуйте <string>&lt;([\s\S]*?)&gt;</string> или <string>(?<=&lt;)([\s\S]*?)(?=&gt;)</string>.   -  person Wiktor Stribiżew    schedule 07.05.2018
comment
Первое предложение не сработало, но второе уже на полпути! XML не нравится <, который у вас есть в первой группе. Я удалил <, и в результате правая угловая скобка не выделена (что мне и нужно), но левая угловая скобка по-прежнему выделена. Другими словами, это дает мне <this  -  person tsouchlarakis    schedule 07.05.2018
comment
Я вижу вашу идею, хотя с просмотром назад, проблема в том, что регулярное выражение не может быть заключено в кавычки, а XML считает, что < является началом нового тега. Есть ли способ обойти использование просмотра назад в первую очередь?   -  person tsouchlarakis    schedule 07.05.2018


Ответы (1)


Вы можете поместить левый и правый разделители внутри конструкций поиска:

<string>(?&lt;=&lt;)([^&gt;]*)(?=&gt;)</string>

Или, используя блок CDATA, чтобы избежать сериализации специальных символов XML:

<string><![CDATA[(?<=<)([^>]*)(?=>)]]></string>

Шаблон будет выглядеть как (?<=<)([^>]*)(?=>) после того, как синтаксический анализатор XML десериализует строку шаблона, и (?<=<) будет соответствовать местоположению, которому непосредственно предшествует символ <, а (?=>) положительный просмотр вперед гарантирует, что следующим символом будет > (иначе совпадение не удастся).

person Wiktor Stribiżew    schedule 07.05.2018
comment
Это работает отлично и очень креативно! Спасибо большое. - person tsouchlarakis; 07.05.2018
comment
@tsouchlarakis Ну, это не так креативно, я просто был сбит с толку [^\&gt;], который не имеет смысла в шаблоне буквальной строки и выглядит вводящим в заблуждение. Как только я понял, что это часть XML, все стало ясно. На самом деле, вы могли бы также - и это лучше - использовать блок CDATA: <string><![CDATA[(?<=<)([^>]*)(?=>)]]></string> - person Wiktor Stribiżew; 07.05.2018
comment
Это работает, и я только что реализовал это. Еще раз спасибо. Можете ли вы объяснить мне, почему лучше использовать блок CDATA? - person tsouchlarakis; 08.05.2018
comment
@tsouchlarakis Вам не нужно сериализовать <, > и &. - person Wiktor Stribiżew; 08.05.2018