繁体   English   中英

C#正则表达式-无限匹配

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM