5

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

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?我想我总是可以用 s 替换所有\r\ns,但我希望如果我能让正则表达式一次完成所有操作,我可以最小化操作。

4

3 回答 3

2

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

  • ^inMultiline模式将匹配输入字符串的开头,或行的开头(由 定义\n)。
  • $inMultiline模式将匹配输入字符串的结尾,或者就在\n.

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

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

请注意,上面的模拟将考虑\r\n有 3 个行首和 3 个行尾。1 个行首和 1 个行尾由字符串的开头和结尾定义。其他 2 个行首和 2 个行尾由\r和定义\n

于 2013-05-14T18:17:32.137 回答
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
}
于 2013-05-14T18:12:10.983 回答
1

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

[\n\r]

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

于 2013-05-14T17:59:41.440 回答