在 c# 正则表达式中将 \r 视为 \n

Mar*_*B42 5 c# regex

我有 ac# 函数,它在输入端查找文本模式并进行一些处理。(我使用的是 3.5 版本的 .net 框架)

public void func(string s)
{
    Regex r = new Regex("^\s*Pattern\s*$", RegexOptions.Multiline | RegexOptions.ExplicitCapture );
    Match m = r.Match(s);
    //Do something with m
}
Run Code Online (Sandbox Code Playgroud)

该函数的使用可能如下所示

string s = "Pattern \n Pattern \n non-Pattern";
func(s);
Run Code Online (Sandbox Code Playgroud)

但是,我发现有时我的输入看起来更像这样

string s = "Pattern \r Pattern \r non-Pattern"
func(s);
Run Code Online (Sandbox Code Playgroud)

它没有被匹配。有没有办法在正则表达式中\r像 a 一样对待\n?我想我总是可以用\rs替换所有的\ns,但我希望如果我可以让正则表达式一次性完成所有操作,我可以最大限度地减少操作。

Sco*_*ain 2

不幸的是,当我遇到类似的情况时,我发现有效的唯一情况是我只使用正则表达式执行两次传递(就像您希望避免的那样),第一个将行结尾标准化,然后第二个可以进行搜索像往常一样,我无法找到任何方法来触发Multiline/r

public void func(string s)
{
    s = Regex.Replace(s, @"(\r\n|\n\r|\n|\r)", "\r\n");
    Regex r = new Regex("^\s*Pattern\s*$", RegexOptions.Multiline | RegexOptions.ExplicitCapture );
    Match m = r.Match(s);
    //Do something with m
}
Run Code Online (Sandbox Code Playgroud)

  • 因为 `\r` 不被视为 Windows 行结束符,而 .NET 是 Windows 技术。“Multiline”的定义不是正则表达式的一个功能,而是.NET添加到正则表达式中的功能,因此没有标准可遵循。 (3认同)
  • 我只是想获取格式错误的数据的所有可能组合,我认为我以前没有遇到过它,但是“\r”在任何[现代操作系统]中都不被认为是有效的结尾(http://en.wikipedia .org/wiki/Newline#Representations)并运行到只有“\r”的数据源,促使我编写复制并粘贴上述代码的片段。谁知道呢,也许有一天我可能会遇到来自 BBC Micro 系统的数据:) (2认同)