尝试在Visual Studio代码中搜索替换,我发现它的Regex风格与完整的Visual Studio不同。具体来说,我尝试用string (?<p>[\w]+)
声明一个命名组,它在Visual Studio中工作,但在Visual Studio代码中不工作。它将报告错误Invalid group
。
除了解决这个特定问题之外,我还在寻找有关Visual Studio代码中Regex风格的信息,以及在哪里可以找到有关它的文档,这样我就可以帮助自己解决可能偶然遇到的任何其他问题。
完整的Visual Studio使用.NET正则表达式作为文档here。这个链接在Stackoverflow的其他地方作为VS代码的文档提到,但它不是。
4条答案
按热度按时间f8rj6qna1#
“在文件中查找/替换”边栏中的Rust Regex
Rob Lourens of MSFT写入文件搜索使用Rust正则表达式。Rust language documentation描述了语法。
“在文件中查找/替换”小部件中的JavaScript正则表达式
Alexandru Dima of MSFT写了find小部件使用JavaScript正则表达式,正如Wicktor所评论的,ECMAScript 5's documentation描述了语法,MDN JavaScript Regular Expression Guide也是如此。
测试差异
find in files侧边栏不支持
(?=foobar)
,而find in file小部件支持这种lookahead语法。关于查找/替换组
若要查找/替换为组,请使用括号
()
进行分组,使用括号$1
、$2
、$3
、$n
进行替换。下面是一个例子。
之前:
之后:
x1c4d 1x指令集
yquaqz182#
Shaun's answer仍然正确,但是为了添加更新,最近VS Code添加了选择使用基于Perl的PCRE 2引擎的选项。您可以通过设置配置启用此选项。
这允许您执行更高级的正则表达式操作,如 lookaheads和backreferences。但是如下所述,正则表达式仍然必须是有效的JavaScript正则表达式。
VS代码支持正则表达式搜索,但是默认情况下不支持反向引用和查找。但是您可以通过设置search.usePCRE2启用这些功能。这会将ripgrep配置为使用PCRE 2正则表达式引擎。虽然PCRE 2支持许多其他功能,但我们只支持在JavaScript中仍然有效的正则表达式,因为仍然使用编辑器的基于JavaScript的搜索来搜索打开的编辑器。
如果你在这里尝试多行搜索,VS代码最近也增加了这个功能!
lskq00tm3#
我发现了关于它的更新信息(2020年7月22日)。
IllusionMH在Github中留下了以下评论:
ripgrep(与PCRE2兼容)已用于“在文件中查找”功能(针对未打开的编辑器),JS引擎仅用于打开的编辑器。
6ie5vjzr4#
vscode使用哪个正则表达式引擎?现在它比以前更细致了。最好的来源是这个vscode wiki:Github维基:正则表达式支持说明:
[At文档顶部]
本文档适用于搜索(
CMD+SHIFT+F/CTRL+SHIFT+F
)和快速打开(CMD+P/CTRL+P
)。默认情况下,VS代码使用ripgrep工具来驱动搜索。...
[At文件结尾]
文本搜索使用两组不同的正则表达式引擎。工作区使用ripgrep搜索,它将使用Rust正则表达式引擎,如果正则表达式在Rust正则表达式引擎中解析失败,将回退到PCRE 2。Rust正则表达式引擎不支持一些功能,如反向引用和查找,所以如果您使用这些功能,将使用PCRE 2。打开的文件使用编辑器本身的JS正则表达式进行搜索。大多数时候,你不需要担心这个,但是你可能会看到一些复杂的正则表达式的解释方式不一致,这就是一个解释。特别是当你看到一个正则表达式在一个文件打开时被解释为一种方式,而在它没有打开时被解释为另一种方式。在替换操作中,每个文件都会被依次打开,搜索查询将作为一个JS正则表达式运行。
另一个潜在的问题是ripgrep和编辑器之间如何处理换行符。编辑器对换行符进行了规范化处理,这样您就可以只使用
\n
来匹配CRLF和LF行尾。实际上,在编辑器中显式匹配\r
是不可能的,因为它已经被规范化了。在工作区中搜索时,VS代码尝试重写正则表达式,以便\n
将匹配CRLF。但是\r\n
或\s\n
也将在关闭的文件中匹配CRLF,而不是在打开的文件中。两个要点:(1)换行符被特殊处理;(2)尽管使用了Rust正则表达式引擎,但仍支持backreference和look-around--如果你的正则表达式中有look-around或backreference,PCRE 2将被用来代替Rust引擎。
更多关于lookaround的信息
用于在活动编辑器中查找的Find Widget(Ctrl+F)只支持所有的查找循环(lookahead和lookbehind),并且这些查找循环可以是非固定长度的。因此,这将在Find Widget中起作用:
(?<!blah.*)
.在跨文件搜索(Ctrl+Shift+F)中,非固定长度的lookbehind不起作用。lookahead可以是固定长度的,也可以是非固定长度的。但是,非固定长度的正lookbehind或负lookbehind不起作用,您将在搜索输入框下面看到一条错误消息:
Regex parse error: lookbehind assertion is not fixed length
,在您实际尝试运行搜索之前,它可能不会显示。