在\ #c regex中将\ r作为\ n处理

我有一个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 } 

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

 string s = "Pattern \n Pattern \n non-Pattern"; func(s); 

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

 string s = "Pattern \r Pattern \r non-Pattern" func(s); 

并没有匹配。 有没有办法让\r在正则表达式中被视为\n ? 我想我总是可以用\n s替换所有\r s,但我希望我可以最小化操作,如果我可以让正则表达式一次完成所有操作。

不幸的是,当我遇到类似的情况时,我发现有效的唯一情况是我只用正则表达式进行两次传递(就像你希望避免的那样),第一个规范化行结束然后第二个可以进行搜索像往常一样,没有办法让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 } 

根据正则表达式中的文档锚点 :

  • Multiline模式下的^将匹配输入字符串的开头或行的开头(由\n定义)。
  • $ in Multiline模式将匹配输入字符串的结尾,或者恰好在\n之前。

如果您的目的是重新定义锚点以定义包含\r\n ,那么您必须使用前瞻和后视来模拟它。

  • ^应该用(?<=\A|[\r\n])模拟
  • $应该用(?=\Z|[\r\n])模拟

注意,上面的模拟将考虑\r\n有3个线的开始和3个线的末端。 1行的开始和1行的结束由字符串的开头和结尾定义。 线的另外2个起点和线的2个末端由\r\n定义。

如果将它们放在字符集中,则可以匹配/ n或/ r

 [\n\r] 

这将匹配\ n或\ r \ n字符之一