Regex在VS Code中向后看?

7vhp5slm  于 2023-05-01  发布在  其他
关注(0)|答案(3)|浏览(160)

我正在VS Code中做一个语法扩展,我在正则表达式模式背后遇到了困难。给定下面的字符串,我只想在**@fmt()之前返回cmp**

@fmt(cmp,foo)

我在另一个编辑器中使用的匹配字符串是这样的:

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

然而,这在VS Code中不起作用,当我进行正则表达式搜索时,它返回的错误是它不是一个有效的表达式。玩它,问题是**〈=**字符,它表示后面的样子。
搜索VS Code网站不会返回任何类型的正则表达式参考指南。搜索Stack Overflow得到了this question,这表明Visual Studio具有唯一的正则表达式定义。不幸的是,这个问题中给出的例子在VS Code中不起作用。
有谁知道如何在VS Code中查找regex后面的内容?或者至少知道VS Code的regex文档在哪里?
我担心这是不可能的,因为根据Stack Overflow参考,JavaScript不支持look behinds。还有一个问题展示了如何在JavaScript函数中模仿look behinds,但我不知道是否有可能用用户定义的函数在VS Code中扩展语言。如果有人知道如何做到这一点,并能为我指出这个方向,这也是一个可以接受的变通方法。

baubqpgj

baubqpgj1#

你 * 可以使用infinite-width lookahead and lookbehind*,而没有任何约束,现在从Visual Studio Code v开始。1.31.0版本

见证明:

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

参见Github [VSCode 1.31] ES2018 RegExp lookbehind assertions are now supported #68004 issue
由于移动到电子3。0RegExp lookbehindAssert现在受支持,因为它们是从Chromium 62Node 8开始受支持的。10.0Electron 3。0使用Chromium 66Node 10。2.0,所以现在支持它们,但是发行说明没有提到现在支持lookhindAssert。
VS Code开发人员确认他们“忘记在发行说明中提到它”是真的。

**请注意,可变长度的查找Assert只在文件编辑器搜索中起作用,而在 Find in Files 搜索(放大镜图标)**中起作用。根据这个GitHub问题讨论

编辑器中的搜索使用JS正则表达式引擎,跨文件搜索使用ripgrep,它不支持[可变长度的lookbehindAssert]。在regex特性支持方面有少量的差异,这是其中之一。
ripgrep repo中查看这些已关闭的问题:

lymnna71

lymnna712#

更新

Visual Studio Code v.1.31.0及更高版本支持regex lookbehind,请参阅Wiktor's answer**
Visual Studio代码使用ECMAScript 5中指定的JavaScript正则表达式,该表达式不支持look behinds(https://github.com/Microsoft/vscode/issues/8635)。
如果您正在执行查找和替换,这里有一个解决方案,您可以尝试(感谢cyborgx37):
搜索表达式:
(lookbehind_expression_)text_to_replace
替换表达式:
$1replacement_text
给定输入:
lookbehind_expression_text_to_replace
输出将是:
lookbehind_expression_replacement_text

ycggw6v2

ycggw6v23#

向前看和向后看都可以在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" }

  ]
}

结束匹配使用后向模式。还请记住,您可以嵌套模式,i。即,您可以为更大结构(例如,例如,整个函数),然后将其部分与子模式匹配(并分配单个样式)。这就是为什么你通常不需要向前看/向后看,因为你知道你在某个代码块中。
对于上面的模式:(\w+)部分是否应该是lookbehind模式的一部分?如果是,则应在最后一个右括号之前。

相关问题