Я работаю над расширением подсветки синтаксиса собственного языка для VSCode. Я сталкиваюсь с проблемой, когда lookbehinds ведут себя странно, когда используются рядом с пробелами.
Пример кода, который я хочу выделить:
variableName :=thisValueShouldHighlight;
variableName := thisValueShouldHighlight;
variableName := thisValueShouldAlsoHighlight,
Пример кода, который я пытаюсь использовать (в tpl.tmLanguage.json
):
"end_variable_assignment": {
"comment": "Covers ending assignment of a value to a variable. IN PROGRESS",
"match": "(?<=:=)\\s*(\\w+)(;|,)$",
"name": "punctuation.accessor.tpl",
"captures": {
"1": {
"name": "entity.name.type.tpl"
},
"2": {
"name": "punctuation.accessor.tpl"
}
}
}
Этот шаблон включен в (в другом шаблоне, который присутствует во всем файле):
{
"include": "#end_variable_assignment"
}
Точка соприкосновения является частью \\s*
регулярного выражения. Вы должны быть в состоянии сделать var:=value
или var := value
или любое количество пробелов между :=
и value
, неважно, сколько. Однако , я получаю это , когда я пытаюсь использовать его:
variableName :=thisHighlightsProperly;
variableName := thisFails;
Я также пробовал только \\s
и \\s+
, и ни одна из них не работает. Я попробовал глупые примеры, чтобы убедиться, что моя логика работает с использованием некоторого заполнителя, такого как (?<=:=)#(\\w+)...
, а затем протестировал его с var:=#value
, который работает ... но он никогда не работает с пробелами.
Я не понимаю, почему это проблема, потому что я использовал \\s*
в другом месте без каких-либо проблем (просто другие обстоятельства). Я не верю, что это проблема со свойством, потому что она работает со всеми , кроме пробелов.
Дополнительная информация: Я проверил это на RegexCoach и Regex101.com, и оно работает там.
Для целей тестирования я также включил пример тестирования кода, который следует выделить здесь: https://drive.google.com/open?id=1yoDXVxW3LFYjejW1wps8ENWUQ4iCal9w
Это самый минимальный пример кода, который я могу предоставить:
tpl 1.15 module Pattern_Module_Name;
pattern Pattern_name 1.0
triggers
on si := SoftwareInstace created, confirmed where name matches "(?i)SomeRegex";
end triggers;
body
// RE: STACKOVERFLOW PROBLEM
// As you can see, these aren't highlighting properly
var_name :=thisShouldHighlight;
var_name := thisShouldHighlightButDoesnt;
var_name := thisShouldHighlightButDoesnt,
end body;
end pattern;
Весь мой пользовательский код языка можно найти на моем GitHub: https://github.com/cdpautsch/vscode-tpl