我正尝试将std stl用法替换为EASTL,并且由于我有很多cpp / h文件,因此我依靠vs-code的“ Search in Files”选项,具有以下模式:>
((?<=#include \<)([^\/(.h)]+?)(?=\>))
这在regexr.com中完全匹配,在match和replace以及vs代码中也都很好,但是由于使用了反向引用,因此需要启用PCRE2引擎的选项。
尝试使用“搜索”侧边栏视图下的$1
引用匹配组#1根本行不通,仅添加“ $ 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 issue和issue: newlines and replace with capture groups。
但是我在Insider的Build中尝试了您的正则表达式,它的结果与以前相同-它插入了文字$1
而不是它的值。它似乎是一个类似的错误,但是由于正则表达式的环顾四周。
所以我尝试了一个更简单的正则表达式,但是没有环顾四周:
^(#include\s+<)([^\.\/]+?)(>)
并替换为$1EASTL/$2.h$3
,它可以正常工作。