正则表达式匹配不起作用

时间:2013-12-03 23:09:05

标签: c# regex

string a = @"<div class=""b-stats""><a name=""wm-table-used""></a><table class=""stats""><thead><tr><th class=""lb""><i class=""lgap""></i></th><th class=""cell  first-cell""><a title=""Сайт"" class=""sortable"" href=""/limit_info.xml?&amp;order_by=host-name&amp;order_by_mode=desc"">Сайт</a></th><th class=""cell number ""><a title=""Лимит"" class=""sortable"" href=""/limit_info.xml?&amp;order_by=host-limit&amp;order_by_mode=desc"">Лимит</a></th><th class=""cell number ""><a title=""Получатель лимита""></a></th><th class=""rb""><i class=""rgap""></i></th></tr><tr class=""shadow""><td class=""head-shadow"" colspan=""5""></td></tr></thead><tbody><tr><td class=""lb""></td><td class=""cell "">rollstavni-msk.ru</td><td class=""cell number"">10</td><td class=""cell"" style=""text-align: right; width: 35%""><a href=""/delegate_limit.xml?host=19814830"">Передать лимит</a></td><td class=""lb""></td></tr><tr class=""another""><td class=""lb""></td><td class=""cell "">tapetum.ru</td><td class=""cell number"">10</td><td class=""cell"" style=""text-align: right; width: 35%""><a href=""/delegate_limit.xml?host=19888241"">Передать лимит</a></td><td class=""lb""></td></tr><tr><td class=""lb""></td><td class=""cell "">www.maga.ru</td><td class=""cell number"">400</td><td class=""cell"" style=""text-align: right; width: 35%""><a href=""/delegate_limit.xml?host=5485565"">Передать лимит</a></td><td class=""lb""></td></tr><tr class=""another""><td class=""lb""></td><td class=""cell "">stilemaster.ru</td><td class=""cell number"">0</td><td class=""cell"" style=""text-align: right; width: 35%""><a href=""/delegate_limit.xml?host=19886870"">Передать лимит</a></td><td class=""lb""></td></tr></tbody><tfoot><tr><th class=""lb""></th><th colspan=""3""></th><th class=""rb""></th></tr></tfoot></table></div><div class=""b-static-text"">";
            Regex rgx = new Regex(@"<td class=""cell "">(?<domain>[^""]+)<\/td.+number"">(?<id>[^""]+)<\/td", RegexOptions.Singleline);
            MatchCollection matches = rgx.Matches(a);

为什么matches.Count = 1?它可能是4。

1 个答案:

答案 0 :(得分:3)

由于已经pointed out,您不应该使用正则表达式来解析HTML / XML。也就是说,问题是.+是贪婪的,所以它将消耗它可以找到的所有字符以满足匹配。

在您的模式中使用非贪婪量词(.+?):

@"<td class=""cell "">(?<domain>[^""]+)<\/td.+?number"">(?<id>[^""]+)<\/td"
                                              ^ see the ? here

您的matches集合现在将包含4个项目。

进一步阅读