使用正则表达式转义换行符。Replace 替换

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

我一直在尝试遵循替换文档,但我似乎无法让这个正则表达式捕获正确的组。

我试图转义换行符,同时忽略已经转义的换行符。

// Simple string with mixed escaped newlines and unescaped newlines
var TEST_STRING = "Hello\\rMy\r\nFriendly\\nWorld";

// Replace all unescaped newlines
// (?<!\\) - ignore patterns with \ preceeding them
// \\ - match a backslash
// (?<symbol>[rn]) - name the character matched in this group "symbol" for use in the replacement, match a 'r' or 'n'
var searchPattern = @"(?<!\\)(?<symbol>(\r|\n))";
var replacement = "\\${symbol}";
var substitutedString = Regex.Replace(input: TEST_STRING, searchPattern, replacement);

// check if the output matches
var EXPECTED_STRING = "Hello\\rMy\\r\\nFriendly\\nWorld";
Console.WriteLine(substitutedString);                    // "Hello\\rMy\\\r\\\nFriendly\\nWorld"
Console.WriteLine(substitutedString == EXPECTED_STRING); // FALSE

我知道我可以捕获并用两个单独的搜索替换它们:

  • @"(?<!\\)\r"
    替换为
    "\\r"
  • @"(?<!\\)\n"
    替换为
    "\\n"

但是我很难将两者组合成一个正则表达式,在一次传递中同时识别

\n
\r

到目前为止我已经尝试过:

  • @"(?<!\\)(?<symbol>(\r|\n))"
  • @"(?<!\\)\\(?<symbol>[rn])"
  • @"(?<!\\)(?<symbol>\\[rn])"

非常感谢任何帮助!

c# regex substitution regexp-replace
1个回答
0
投票
var pattern = @"(?<!\\)(\r|\n)";
var replacement = @"\\${0}";

这些会起作用的。

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