我一直在尝试遵循替换文档,但我似乎无法让这个正则表达式捕获正确的组。
我试图转义换行符,同时忽略已经转义的换行符。
// 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])"
非常感谢任何帮助!
var pattern = @"(?<!\\)(\r|\n)";
var replacement = @"\\${0}";
这些会起作用的。