C# NET正则表达式是否可以包括'\n';?
我有类似xml的格式文件 我需要每个组件提供3个信息。(时间、类名、内容)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
福
酒吧
堆栈
溢流
在这种情况下,结果应该是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#不支持正则表达式。您使用的打印
类是.NET Regex类。另外,不要使用正则表达式解析XML。它在许多情况下都不起作用。最后,您的XML格式不正确。您必须打开未关闭的标记。抱歉,问题不好。我编辑了代码。这种格式称为“SAMI”,并不为人所知。我必须使用它。这一个不起作用。你应该有4个匹配项,但只有3个。@RobertKoritnik你说得对,当我复制粘贴输入以编写正则表达式时,我错过了第一行,并最终假设Regex
在其他参数之前。修复了,谢谢。:)如中所述,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(); }