vs代码无法在PCRE2模式下使用正则表达式组引用替换

时间:2019-03-30 02:08:19

标签: regex visual-studio-code pcre

我正尝试将std stl用法替换为EASTL,并且由于我有很多cpp / h文件,因此我依靠vs-code的“ Search in Files”选项,具有以下模式:

((?<=#include \<)([^\/(.h)]+?)(?=\>))

这在regexr.com中完全匹配,在match和replace以及vs代码中也都很好,但是由于使用了反向引用,因此需要启用PCRE2引擎的选项。

尝试使用“搜索”侧边栏视图下的$1引用匹配组#1根本行不通,仅添加“ $ 1”。

enter image description here

但是,如果我手动搜索并替换每个文件的相同输入,它将按预期工作。

enter image description here

谢谢。

1 个答案:

答案 0 :(得分:1)

编辑:已修复导致replace无法正常使用环视效果的错误,请参见capture group in regex not working。它可以在Insider的内部版本中运行,并且可能包含在 v1.39 中。

但是,您的正则表达式:

((?<=#include \<)([^\/(.h)]+?)(?=\>))应该更改为:

((?<=#include <)([^\/(.h)]+?)(?=>))请注意,删除<>之前的转义符,然后从该日期开始在Insider的内部版本中起作用。

[自原始问题以来,PCRE2模式已被弃用。因此,您不再需要该选项,PCRE2将在需要时自动使用。]


将搜索/替换与换行符一起使用时,也会出现类似的错误,而替换仅按字面意义插入$1而不是捕获组的值。此错误已在最新的Insider's Build中修复,请参见multiline replace issueissue: newlines and replace with capture groups

但是我在Insider的Build中尝试了您的正则表达式,它的结果与以前相同-它插入了文字$1而不是它的值。它似乎是一个类似的错误,但是由于正则表达式的环顾四周。

所以我尝试了一个更简单的正则表达式,但是没有环顾四周:

^(#include\s+<)([^\.\/]+?)(>)

并替换为$1EASTL/$2.h$3,它可以正常工作。

search replace demo: no lookarounds