我正在使用VS Code进行语法扩展,而且我在查看正则表达式模式时遇到了困难。给定以下字符串,我想只返回 cmp ,前面是 @fmt(
@fmt(cmp,foo)
我在另一个编辑器中使用的匹配字符串是:
(?<=[@|©](fmt)\()(\w+)
但是,这在VS Code中不起作用,当我进行正则表达式搜索时,它会返回错误,表明它不是有效的表达式。玩弄它,问题是&lt; = 字符,表明背后的外观。
搜索VS Code网站并不会返回任何类型的正则表达式参考指南。搜索Stack Overflow出现了this question,它表明Visual Studio具有唯一的正则表达式定义。不幸的是,该问题中给出的示例在VS Code中不起作用。
有没有人知道如何在VS Code中查看正则表达式?或者至少知道VS Code的正则表达式文档在哪里?
我担心这是不可能的,因为根据Stack Overflow reference来看,JavaScript支持不支持。 another question显示了如何模仿JavaScript函数中的后台,但我不知道是否可以使用用户定义的函数扩展VS Code中的语言。如果有人知道如何做到这一点,并且可以指出我朝这个方向发展,那也是一种可接受的解决方法。
答案 0 :(得分:5)
Visual Studio代码使用ECMAScript 5中指定的JavaScript正则表达式,它不支持外观(https://github.com/Microsoft/vscode/issues/8635)。
如果你正在寻找和替换,你可以尝试一种解决方法(感谢cyborgx37):
搜索表达式:
(lookbehind_expression_)text_to_replace
替换表达式:
$1replacement_text
鉴于输入:
lookbehind_expression_text_to_replace
输出将是:
lookbehind_expression_replacement_text
答案 1 :(得分:3)
从Visual Studio Code v.1.31.0版本开始,您现在可以不受任何限制地使用infinite-width lookahead and lookbehind
。
查看证据:
和另一个(使用(?<=@fmt\([^()]*)\w+
模式,请注意后面的*
):
请参见Github [VSCode 1.31] ES2018 RegExp lookbehind assertions are now supported #68004
issue:
由于迁移到 Electron 3.0 ,现在支持
RegExp
后向断言,因为自 Chromium 62 和 Node以来受支持。 8.10.0 和 Electron 3.0 使用 Chromium 66 和 Node 10.2.0 ,因此现在支持它们,但是发行说明中没有提到现在支持向后声明。
VS Code开发人员confirm that it is true,他们“忘了在发行说明中提及它”。
答案 2 :(得分: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模式的一部分吗?如果是这样,它应该在最后一个右括号之前。