Visual Studio - 查找并替换为带换行符的正则表达式

问题描述 投票:0回答:1

假设我有一些换行符顺序错误的字符串,

\n\r
。如果我用正则表达式找到
(?<!\\r)\\n\\r
(“
\n\r
前面没有
\r
”)并替换为
\r\n
,则替换将是实际的换行符,而不是四个字符
\r\n
。但如果我用
\\r\\n
替换,我会得到六个字符而不是四个。替换字符串似乎被解释为某种“半正则表达式”,其中
\r
\n
被识别为特殊字符,但
\\
不是。

Notepad++ 和 Eclipse 不以这种方式工作,因为它们用正则表达式替换了正则表达式。有没有办法告诉 Visual Studio 用正则表达式替换正则表达式或用纯文本替换正则表达式?

regex visual-studio replace
1个回答
0
投票

是的,正如您所指出的,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

如前所述,要使

$+
的技巧发挥作用,您需要在“查找内容”字符串的末尾添加一个空组
()

© www.soinside.com 2019 - 2024. All rights reserved.