正则表达式看看VS Code背后?

时间:2016-10-07 11:01:03

标签: regex visual-studio-code regex-lookarounds vscode-extensions

我正在使用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中的语言。如果有人知道如何做到这一点,并且可以指出我朝这个方向发展,那也是一种可接受的解决方法。

3 个答案:

答案 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

查看证据:

enter image description here

和另一个(使用(?<=@fmt\([^()]*)\w+模式,请注意后面的*):

enter image description here

请参见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模式的一部分吗?如果是这样,它应该在最后一个右括号之前。