1

Я работаю над расширением грамматики в VS Code, и у меня возникают трудности с просмотром шаблона регулярных выражений. Учитывая следующую строку, я хочу вернуть только CMP, когда он предшествует @fmt (Regex заглянуть в VS Code?

@fmt(cmp,foo) 

Совпадение строка я в другом редакторе был такой:

(?<=[@|©](fmt)\()(\w+) 

Однако, это не работает в VS Code, когда я выполняю поиск в регулярном выражении, он возвращается с ошибкой, что это не допустимое выражение. В этом случае проблема заключается в том, что < = символов, которые указывают на внешний вид.

Выполнение поиска веб-сайта VS Code не возвращает никакого справочного руководства по регулярному выражению. Поиск переполнения стека вызвал this question, в котором говорится, что Visual Studio имеет уникальные определения регулярных выражений. К сожалению, пример, приведенный в этом вопросе, не работает в VS Code.

Кто-нибудь знает, как выглядеть за регулярным выражением в коде VS? Или, по крайней мере, знаете, где находится документация по регулярному выражению для кода VS?

Я беспокоюсь, что это невозможно, так как в соответствии с Stack Overflow reference внешний вид не поддерживается в JavaScript. Существует another question, в котором показано, как имитировать внешний вид в функции JavaScript, но я не знаю, можно ли расширить язык в коде VS с помощью пользовательских функций. Если кто-то знает, как это сделать, и может указать мне в этом направлении, это также будет приемлемым обходным решением.

+0

Почему вам нужно вообще просмотра назад? Используйте '([@ ©] fmt \() (\ w +)' и делайте то, что вам нужно, с захваченными значениями через обратные ссылки '$ 1' и' $ 2'. VSC не поддерживает lookbehinds, это по дизайну. Или «до дальнейшего обратите внимание: « –

+0

Thomas, что вы делаете? Пожалуйста, объясните, что вам нужно сделать с помощью' @fmt (cmp, foo) '? Каков конечный результат? Найдите и выделите? Тогда вам вообще не нужен lookbehind, ни захват групп - '[@ ©] fmt \ (\ w +' будет достаточно. –

+0

Это для подсветки синтаксиса, я хочу, чтобы ** @ fmt ** был одним цветом (функцией), а ** cmp ** - другой цвет (параметр). Существует несколько возможных строк, следующих за символами @, это был просто упрощенный пример. – thomasjbarrett

ответ

0

Посмотрите вперед и посмотрите, как работают в VS Code. Загрузите некоторые из существующих языковых плагинов и посмотрите их правила, чтобы узнать, как это должно быть сформулировано. Вот часть из моего расширения грамматики ANTLR:

{ 
    "name": "meta.rule.parser.antlr", 
    "begin": "[[:lower:]][[:alnum:]_]*(?=.*?:)", 
    "beginCaptures": { 
    "0": { "name": "entity.name.function.parser.antlr" } 
    }, 
    "end": "(?<=;)", 
    "patterns": [ 
    { 
     "name": "variable.other", 
     "match": "\\[.*?\\]" 
    }, 
    { 
     "name": "keyword.other.antlr", 
     "match": "\\b(returns|locals)\\b" 
    }, 
    { 
     "name": "keyword.other.antlr", 
     "match": "@\\w+" 
    }, 
    { 
     "name": "entity.other.rule.option", 
     "match":" <.*?>" 
    }, 
    { 
     "name": "variable.other.antlr", 
     "match": "\\w+\\s*=" 
    }, 
    { 
     "name": "entity.name.tag.antlr", 
     "match": "#.*" 
    }, 

    { "include": "#comments" }, 
    { "include": "#strings" }, 
    { "include": "#lexer-rule-reference" }, 
    { "include": "#parser-rule-reference" }, 
    { "include": "#predicate" }, 
    { "include": "#action" }, 
    { "include": "#wildcard-regexp" }, 
    { "include": "#regexp-parts" }, 
    { "include": "#options-list" } 

    ] 
} 

Конец матча использует внешний вид. Помните также, что вы можете вставлять шаблоны, т. Е. Вы можете определить начало/конец для большей структуры (например, целую функцию), а затем сопоставить ее части с дополнительными шаблонами (и назначить индивидуальный стиль). Это почему вам часто не нужно смотреть вперед/назад, потому что вы знаете, что находитесь в определенном блоке кода.

Для вашего рисунка выше: это часть (\w+), которая должна быть частью шаблона lookbehind? Если это так, это должно быть до последней закрывающей круглой скобки.

+0

Я пробовал синтаксис '(? <=)', Все еще получая недопустимую ошибку регулярного выражения/недопустимой группы. Кажется, что код VS не поддерживает обратные ссылки: https://github.com/Microsoft/vscode/issues/8635 – Adam

0

Код Visual Studio использует регулярные выражения JavaScript, как указано в ECMAScript 5, который не поддерживает внешний вид (https://github.com/Microsoft/vscode/issues/8635).

Вот обходной путь, вы можете попробовать, если вы делаете поиск и замену (спасибо cyborgx37):

Поиск Expression:

(lookbehind_expression_)text_to_replace

Заменить выражение:

$1replacement_text

С учетом ввода:

lookbehind_expression_text_to_replace

Выход будет:

lookbehind_expression_replacement_text