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

将\r\n视为c#regex中的,c#,regex,C#,Regex,我有一个c#函数,它在输入端查找文本模式并进行一些处理。(我使用的是.net framework的3.5版本) 函数的用法可能如下所示 string s = "Pattern \n Pattern \n non-Pattern"; func(s); string s = "Pattern \r Pattern \r non-Pattern" func(s); 然而,我发现有时我的输入看起来更像这样 string s = "Pattern \n Pattern \n non-Pattern";

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

函数的用法可能如下所示

string s = "Pattern \n Pattern \n non-Pattern";
func(s);
string s = "Pattern \r Pattern \r non-Pattern"
func(s);
然而,我发现有时我的输入看起来更像这样

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,但我希望如果我可以让正则表达式一次完成所有操作,我可以最小化操作。

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

[\n\r]

这将匹配\n或\r字符中的一个

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

根据文件:

  • 多行
    模式下,
    ^
    将匹配输入字符串的开头或行的开头(如
    \n
    所定义)
  • $
    多行
    模式下,将匹配输入字符串的结尾,或正好在
    \n
    之前
如果您的目的是重新定义锚定以定义一条既有
\r
又有
\n
的线,则必须使用“向前看”和“向后看”对其进行模拟


  • ^
    应该用
    来模拟(?是的,我想我必须做一些类似的事情。我想知道为什么
    $
    \r
    不匹配?感觉应该是这样。因为
    \r
    不被认为是windows行结尾,.NET是windows技术。“多行”的定义不是ReGEX的一个特性,而是一个.NET添加到ReEX中的特性,因此没有任何标准可以遵循。我认为2遍解决方案是有意义和更容易维护的。只是想知道为什么<代码> \n\r>代码>被认为是1行的末尾?我只是尝试得到所有可能的畸形数据的组合,我想我以前没有击中过它,但是<代码> \r 在任何情况下都不被认为是一个有效的结尾,而在一个只有
    \r
    的数据源中运行是促使我编写复制并粘贴上述代码的代码段的原因。谁知道呢,也许有一天我会遇到来自BBC微系统的数据:)我当然不希望
    \r
    成为新行,并将其从我的单元测试中排除(这些测试都通过了
    \n
    !)。但是,由于
    \r
    出现在我预期的
    \n
    位置,我的代码开始无法运行。请更新有关如何定义行的问题。这个答案定义了以
    \r
    \n
    结尾的一行。我不确定是否完全理解你的意思。对于我的应用程序,
    \r\n
    只有一两行没有任何区别。只要
    模式
    作为输入文本的整行存在,我就可以匹配这种
    模式的每一行
    @MarkB42:这取决于您的模式。现在我还不能给出一个例子,但我相信某些模式会有所不同。