假设我有一些换行符顺序错误的字符串,
\n\r
。如果我用正则表达式找到 (?<!\\r)\\n\\r
(“\n\r
前面没有 \r
”)并替换为 \r\n
,则替换将是实际的换行符,而不是四个字符 \r\n
。但如果我用 \\r\\n
替换,我会得到六个字符而不是四个。替换字符串似乎被解释为某种“半正则表达式”,其中 \r
和 \n
被识别为特殊字符,但 \\
不是。
Notepad++ 和 Eclipse 不以这种方式工作,因为它们用正则表达式替换了正则表达式。有没有办法告诉 Visual Studio 用正则表达式替换正则表达式或用纯文本替换正则表达式?
是的,正如您所指出的,Visual Studio 在替换字符串中使用这个“半正则表达式”。我必须在 VS 扩展多行搜索和替换中解决它。我已在
MultilineSearchReplace.cs中的
ConvertReplaceWithToRegEx
和 ConvertFindWhatToRegEx
方法中详细记录了它。
以下规则适用于替换字符串(这是我观察到的)。我使用的解决方法:
$
用于组替换。$$
应用于替换为 $
文字。但这仅在替换字符串中也存在任何组替换(例如,$1
,$+
,...)时才有效。因此,用 $$ $1
替换是可行的,但简单的 $$
会插入两个 $$。我们需要使用下面描述的技巧
并始终使用 $+$
。\r
\n
和 \t
之外,所有其他字符都被视为文字。所有其他组合都可以。\\
无法转义 \
字符。所以我们不能用\r
来逃避\\r
。我们需要使用更复杂的 \$+r
,再次,$+
替换最后一组(需要在“查找内容”中定义并且必须为空)。如果我们想用如下文本替换,这一点很重要:C:\MyFolder\root\nextLevel\test
如果不逃避,我们会得到:
C:\MyFolder
oot
extLevel est
如前所述,要使
$+
的技巧发挥作用,您需要在“查找内容”字符串的末尾添加一个空组 ()
。