【问题标题】:What flavor of Regex does Visual Studio Code use?Visual Studio Code 使用什么风格的 Regex?
【发布时间】:2017-06-29 23:05:42
【问题描述】:

尝试在 Visual Studio Code 中进行搜索替换,我发现它的 Regex 风格与完整的 Visual Studio 不同。具体来说,我尝试使用 string (?<p>[\w]+) 声明一个命名组,该组在 Visual Studio 中有效,但在 Visual Studio Code 中无效。它会报错Invalid group

除了解决这个特定问题之外,我还在寻找有关 Visual Studio Code 中正则表达式风格的信息以及在哪里可以找到有关它的文档,这样我可以帮助自己解决我可能偶然发现的任何其他问题。

完整的 Visual Studio 使用记录在 here 中的 .NET 正则表达式。这个链接在 Stackoverflow 上的其他地方被称为 VS Code 的文档,但事实并非如此。

【问题讨论】:

  • VSCode 使用的是基于 JavaScript 的正则表达式引擎,但并不相同。你不能在那里使用命名的捕获组。
  • 没有关于 VSCode 中使用的正则表达式的具体文档。但是,如果您查看source code,您会看到很多 JS 代码。如果您尝试使用lookbehinds,您会得到无效的模式错误,而lookaheads 工作。并且 JS 正则表达式风格是唯一将 [^] 模式视为匹配任何符号的正则表达式引擎。所以,很明显它是 JS 正则表达式引擎。
  • 标准是ECMAScript 5
  • 好的。好吧,如果您确定并且您有一些指向文档的链接,您可以回答。我会投票。如果 ECMAScript 规范是唯一的,请不要认为它是一个很好的链接。
  • 那么,你期待什么样的答案呢?我在上面发布的所有内容+指向 JS 正则表达式语法描述的链接?喜欢MDN reference

标签: regex replace visual-studio-code


【解决方案1】:

我发现了关于它的更新信息(2020 年 7 月 22 日)。

IllusionMH 在 Github 中留下了以下 comment

ripgrep(与 PCRE2 兼容)已用于在文件中查找 功能(用于未打开的编辑器)和仅用于打开的 JS 引擎 编辑。

【讨论】:

    【解决方案2】:

    Shaun's answer 仍然正确,但是要添加更新,recently VS Code added 可以选择使用基于 Perl 的 PCRE2 引擎。您可以通过设置配置启用此功能。

    这允许您执行更高级的正则表达式操作,例如 lookaheads 和 backreferences。但正如下面的noted,正则表达式仍然必须是有效的 JavaScript 正则表达式

    VS Code 确实支持正则表达式搜索,但是, 默认情况下不支持反向引用和环视。但是你可以 使用设置 search.usePCRE2 启用这些。这配置了 ripgrep 使用 PCRE2 正则表达式引擎。虽然 PCRE2 支持许多其他 功能,我们只支持在仍然有效的正则表达式 JavaScript,因为仍然使用编辑器的 基于 JavaScript 的搜索。

    如果您最终在这里尝试进行多行搜索,还有奖金VS Code recently added that feature as well

    【讨论】:

    • PCRE2 可以在设置菜单中激活。转到 Preferences~Settings 并搜索“regex”
    • Looks like that setting is deprecated,当默认引擎不支持某个功能时,PCRE2 会自动用作备用。
    【解决方案3】:

    文件侧栏中的查找/替换中的 Rust 正则表达式

    Rob Lourens of MSFT 写道,文件搜索使用 Rust 正则表达式。 Rust language documentation 描述了语法。

    “文件中的查找/替换”小部件中的 JavaScript 正则表达式

    Alexandru Dima of MSFT 写道,查找小部件使用 JavaScript 正则表达式。正如 Wicktor 评论的那样,ECMAScript 5's documentation 描述了语法。 MDN JavaScript Regular Expression Guide 也是如此。

    测试差异

    文件中的查找侧边栏不支持(?=foobar),而文件中的查找小部件支持前瞻语法。

    关于使用组查找/替换

    要查找/替换组,请使用括号 () 进行分组,使用括号 $1$2$3$n 进行替换。

    这是一个例子。

    之前:

    之后:

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-09
    • 1970-01-01
    • 2021-05-19
    • 2023-01-20
    • 2023-03-24
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多