C# NET正则表达式是否可以包括'\n';?

C# NET正则表达式是否可以包括'\n';?,c#,regex,C#,Regex,我有类似xml的格式文件 我需要每个组件提供3个信息。(时间、类名、内容) 福 酒吧 堆栈 溢流 在这种情况下,结果应该是4组信息,包括{25199,ENCC,foo} Regex exp = new Regex(@"<Sync Start=(.*?)><P Class=(.*?)>(.*?)", RegexOptions.IgnoreCase); MatchCollection MatchList = exp.Matches(text); foreach (M

我有类似xml的格式文件

我需要每个组件提供3个信息。(时间、类名、内容)

酒吧

堆栈

溢流

在这种情况下,结果应该是4组信息,包括{25199,ENCC,foo}

Regex exp = new Regex(@"<Sync Start=(.*?)><P Class=(.*?)>(.*?)", RegexOptions.IgnoreCase);
MatchCollection MatchList = exp.Matches(text);
foreach (Match FirstMatch in MatchList){
    GroupCollection groups = FirstMatch.Groups;
    foreach(Group g in groups){
        Console.WriteLine(g.Value);
    }
}
Regex exp=new Regex(@“

(.*)”,RegexOptions.IgnoreCase); MatchCollection MatchList=exp.Matches(文本); foreach(匹配列表中的第一个匹配){ GroupCollection groups=FirstMatch.groups; foreach(g组分组){ 控制台写入线(g.Value); } }

这个打印时间,类名。除了内容


请分享您的经验和知识。

下面的正则表达式将从四行中捕获上述三个值

/<Sync Start=(.*?)><P Class=(.*?)>\n(\w+)/gm
/

\n(\w+)/gm

C#代码应该是

String input = @"<Sync Start=25199><P Class=ENCC>
foo
<Sync Start=26522><P Class=ENCC>
bar
<Sync Start=27863><P Class=ENCC>
stack
<Sync Start=30087><P Class=ENCC>
overflow";
Regex rgx = new Regex(@"(?m)<Sync Start=(.*?)><P Class=(.*?)>\n(\w+)");
foreach (Match m in rgx.Matches(input))
{
Console.WriteLine(m.Groups[1].Value);
Console.WriteLine(m.Groups[2].Value);
Console.WriteLine(m.Groups[3].Value);
 }
String input=@“

酒吧

堆栈

溢出”; 正则表达式rgx=新正则表达式(@“(?m)

\n(\w+); foreach(在rgx中匹配m.Matches(输入)) { Console.WriteLine(m.Groups[1].Value); Console.WriteLine(m.Groups[2].Value); Console.WriteLine(m.Groups[3].Value); }

说明:

  • 捕获符号后面的所有字符
  • 使用此模式:

    (?m)^<Sync Start=([^>]+)><P Class=([^>]+)>\s*^([^<]\S+)
    
    (?m^]+)>

    ]+)>\s*^([^

  • ]+)

    匹配任何非
  • 匹配文本字符
  • \s*
    匹配任何空白,包括换行符
  • ^
    锚定声明我们处于该行的开头
  • ([^您问题的直接答案
    
    只要您在构建正则表达式实例时设置了
    RegexOptions,它就可以包含换行符。多行

    请编辑您的代码,使其实际编译-
    不作为变量存在,并且
    打印
    不是一种正常的方法。一个简短但完整的程序说明这个问题非常有帮助-我们应该能够复制、粘贴、编译和运行。首先,C#不支持正则表达式。您使用的
    Regex
    类是.NET Regex类。另外,不要使用正则表达式解析XML。它在许多情况下都不起作用。最后,您的XML格式不正确。您必须打开未关闭的标记。抱歉,问题不好。我编辑了代码。这种格式称为“SAMI”,并不为人所知。我必须使用它。这一个不起作用。你应该有4个匹配项,但只有3个。@RobertKoritnik你说得对,当我复制粘贴输入以编写正则表达式时,我错过了第一行,并最终假设
    foo
    在其他参数之前。修复了,谢谢。:)如中所述,
    多行
    模式所做的一切就是更改锚点(
    ^
    $
    )的行为。您可能会想到
    单线
    模式,它允许
    匹配换行符,但这在这里也没有用;第三个
    (.*)OP的正则表达式中的
    仍然不匹配,贪婪的
    (.*)
    匹配太多。但是您可以始终将文本与其中的换行符匹配,不需要修改器。在这种情况下,您只需将第三个
    (.*)
    更改为
    ([^]*)
    (?m)^<Sync Start=([^>]+)><P Class=([^>]+)>\s*^([^<]\S+)
    
    var myRegex = new Regex(@"(?m)^<Sync Start=([^>]+)><P Class=([^>]+)>\s*^([^<]\S+)");
    Match matchResult = myRegex.Match(yourString);
    while (matchResult.Success) {
        Console.WriteLine(matchResult.Groups[1].Value,
                          matchResult.Groups[2].Value,
                          matchResult.Groups[3].Value);
        // Add them to whatever data structure you like
        matchResult = matchResult.NextMatch();
    }