[英]C# Regex - endless matching
我想使用Regex从重复的XML标签获取数据:
<A>cat</A><A>dog</A>
所以我创建了Regex:
<A>(.*?)</A>
和代码:
string text = "<A>asdasd</A><A>dsfsd</A>";
string regex = @"<A>(.*?)</A>";
Regex rgx = new Regex(regex);
Match match = rgx.Match(text);
while(match.Success)
{
i++;
Console.WriteLine(match.Groups[1].Value);
match.NextMatch();
}
但是,当我启动代码时,循环是无限的,永远不会停止。
有人可以帮我找到代码的问题吗? 还是找到其他解决方案? (我不想反序列化XML)。
这个:
match.NextMatch();
只是返回下一个比赛,它不会改变match
本身的状态。 您需要更新变量:
match = match.NextMatch();
虽然失败的原因是您没有分配下一个匹配项match
,但实际上可以使用Regex.Matches
获得所需的所有子字符串,而无需显式循环:
var results = rgx.Matches(text)
.Cast<Match>()
.Select(m => m.Groups[1].Value);
Console.WriteLine(string.Join("\n", results));
参见C#在线演示 :
var text = "<A>asdasd</A><A>dsfsd</A>";
var regex = @"<A>(.*?)</A>";
var rgx = new Regex(regex);
var results = rgx.Matches(text)
.Cast<Match>()
.Select(m => m.Groups[1].Value);
Console.WriteLine(string.Join("\n", results));
// asdasd
// dsfsd
只需使用Regex.Matches将它们全部加载到一个集合中,然后进行迭代即可。
string text = "<A>asdasd</A><A>dsfsd</A>";
string regex = @"<A>(.*?)</A>";
foreach (Match m in Regex.Matches(text, regex))
{
Console.WriteLine(m.Groups[1].Value);
}
或使用Linq单行:
Regex.Matches(text, regex).Cast<Match>().ToList().ForEach(m => Console.WriteLine(m.Groups[1].Value));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.