C# Regex lookahead赢得';我不能在.NET中工作

C# Regex lookahead赢得';我不能在.NET中工作,c#,.net,regex,regex-lookarounds,C#,.net,Regex,Regex Lookarounds,我有一个带有lookahead的正则表达式,它可以与Regexr.com一起使用,但在.NET应用程序中使用它时却不能 这是一些输入数据的示例(请注意,我只是为了可读性而创建了换行符,文本实际上只是一个长行,因此需要一个正则表达式) 使用以下regexp: (.+?)(?=(\\r\\n\d{1,2}[.] [A-Z]{3})|$) ,我希望捕获每一行,希望用“20.AUG”等分隔它们。因为分隔符也应该被捕获,所以我使用了向前看。 Regexr.com上的一切都很好,例如: 在.NET中执行此

我有一个带有lookahead的正则表达式,它可以与Regexr.com一起使用,但在.NET应用程序中使用它时却不能

这是一些输入数据的示例(请注意,我只是为了可读性而创建了换行符,文本实际上只是一个长行,因此需要一个正则表达式)

使用以下regexp:

(.+?)(?=(\\r\\n\d{1,2}[.] [A-Z]{3})|$)
,我希望捕获每一行,希望用“20.AUG”等分隔它们。因为分隔符也应该被捕获,所以我使用了向前看。 Regexr.com上的一切都很好,例如:

在.NET中执行此操作时:

Regex.Matches(input, "(.+?)(?=(\r\n\\d{1,2}[.] [A-Z]{3})|$)")
我只得到以下结果:

-100
-90
200
50
-200
-200
我尝试了多种regexoption,比如multiline和其他一些,但没有结果

非常感谢您的帮助或提示。谢谢你

编辑 根据这些评论,很明显,原来的问题具有误导性。问题来自以下方面:

string input = "Example\r\nText";
string notActuallyTheInput = "Example\\r\\nText"; 
原始C#代码使用字符串文字,其中包含字符的精确序列
\r\n
,例如:

string input = "Example\r\nText";
string notActuallyTheInput = "Example\\r\\nText"; 
然后将字符串的内容原封不动地复制到online regular expression tester,因此测试将在以下等效项上运行:

string input = "Example\r\nText";
string notActuallyTheInput = "Example\\r\\nText"; 
现在很清楚,这个问题意味着
输入
字符串文字写在一行上,但输入本身确实跨越多行。因此,问题在于表达式的
(.+?)
部分。默认情况下,
字符与换行符不匹配。所需的行为是
RegexOptions.Singleline
选项的行为,如以下示例程序所示

using System;
using System.Text.RegularExpressions;

class Program
{
    private const string Input =
        "26. AUG\r\n2014\r\n27.08 Testing 1\r\n -100\r\n" +
        "20. AUG\r\n2014\r\n27.08 Testing 2\r\n -90\r\n" +
        "15. AUG\r\n2014\r\n27.08 Testing 3\r\n 200\r\n" +
        "9. AUG\r\n2014\r\n27.08 Testing 4\r\n 50\r\n" +
        "4. AUG\r\n2014\r\n27.08 Testing 5\r\n -200\r\n" +
        "25. JUL\r\n2014\r\n27.08 Testing 5\r\n -200\r\n";

    static void Main(string[] args)
    {
        string pattern = @"(.+?)(?=(\r\n\d{1,2}[.] [A-Z]{3})|$)";
        var matches = Regex.Matches(Input, pattern, RegexOptions.Singleline);

        Console.WriteLine("{0} Matches:", matches.Count);
        foreach (Match match in matches)
            Console.WriteLine("  {0}", match.Value.Replace("\r", "\\r").Replace("\n", "\\n"));

        // OUTPUT:
        //
        // 7 Matches:
        //   26. AUG\r\n2014\r\n27.08 Testing 1\r\n -100
        //   \r\n20. AUG\r\n2014\r\n27.08 Testing 2\r\n -90
        //   \r\n15. AUG\r\n2014\r\n27.08 Testing 3\r\n 200
        //   \r\n9. AUG\r\n2014\r\n27.08 Testing 4\r\n 50
        //   \r\n4. AUG\r\n2014\r\n27.08 Testing 5\r\n -200
        //   \r\n25. JUL\r\n2014\r\n27.08 Testing 5\r\n -200\r
        //   \n
    }
}

原始答案 问题可能源于将正则表达式错误地转换为C#字符串文字

下面的表达:

(.+?)(?=(\\r\\n\d{1,2}[.] [A-Z]{3})|$)
将以C#字符串文字形式写入以下内容之一:

"(.+?)(?=(\\\\r\\\\n\\d{1,2}[.] [A-Z]{3})|$)"

@"(.+?)(?=(\\r\\n\d{1,2}[.] [A-Z]{3})|$)"
由于输入不包含任何引号字符,后者当然是最简单的翻译,因为它是原始表达式的精确副本

完成程序以重现结果
默认情况下,正则表达式通配符
与换行符不匹配

字符串显示为“一行”,但包含换行符(
\r\n
),一旦在字符串文本中进行解释,将阻止点匹配所需的所有内容

它将尝试匹配
26。8月
,然后是2014年。。。直到
-100
,当前瞻最终匹配时,您的最终结果

使用点匹配所有标志:

(?s).+?(?=\\r\\n\d{1,2}[.] [A-Z]{3}|$)

如果文本的格式始终相同(由4列组成,由文字分隔
\r\n
),则可以使用以下简单模式:

string pattern = @"(?:[^\\]+\\r\\n){4}";

在该链接中显示的表达式与在.NET中使用的表达式不同。特别是,序列
\\r\\n\d
变成了
\d
,其中
是字符串中的文本回车换行符。这到底是为什么被否决的?它经过充分的研究,充分地陈述了问题,并且清晰简洁。我不知道你还需要什么。我不确定你的编辑是否正确@280Z28。这正是我使用的代码:Regex.Matches(text,“(.+?)(?=(\r\n\\d{1,2}[.][A-Z]{3})|$)”)为什么需要转义?我想我忘了在d之前有一张双人票,但它不起作用。我尝试了两种方法,结果只有一种,那就是来自|$@280Z28的结果。我认为问题不在于字符转义不正确。他似乎是正则表达式correct@Anirudha当使用正确的字符串时,C#输出与他要求的精确输出相匹配。@Andreas当
Input
是您在该链接上使用的输入,并且
pattern
是此答案中的输入时,则
Regex.matches(Input,pattern)
返回与您指出的是该链接所需结果相同的6个值。您的程序示例运行正常。但是我的字符串包含\r\n而不是\\r\\n。如果我尝试将您的示例代码修改为该代码和正则表达式,它将给出与以前相同的结果,结果中只有数字(-200等)。抱歉,这不起作用。只给出一个结果,实际上是整行。尽管确切的正则表达式对我不起作用,但你关于“一行”的说法是正确的,谢谢。正如280Z28所回答的,我所要做的就是添加单线选项。看起来不错,我想我可以信赖它。但奇怪的是,我无法让它在.NET中运行。但我可以看出它与你的例子是一致的。在.NET中,我只做Regex.Matches(文本,@“(?:[^\]+\r\n){4}”)。它只给出一个结果,所有文本都作为结果。我也试过使用\\r\\n。@Andreas:你在我的答案中看到的模式有很多斜杠,不需要更改,只需简单的复制/粘贴即可。对不起,不行。请参阅:执行后匹配3将没有结果。@Andreas:很自然,它不起作用,您的原始字符串没有逐字格式!