在\ #c regex中将\ r视为\ n

时间:2013-05-14 17:52:05

标签: c# regex

我有一个c#函数,可以在输入端查找文本模式并进行一些处理。 (我使用的是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?我想我总是可以用\r替换所有\n s,但是如果我能让正则表达式一次完成所有操作,我希望能最小化操作。

3 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:2)

根据文件Anchors in Regular Expression

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

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

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

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

答案 2 :(得分:1)

如果将它们放在字符集

中,您可以匹配/ n或/ r
[\n\r]

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