正则表达式匹配集合多个匹配

7

我想要提取在<td></td>之间的所有文本,但我只得到了集合中的第一个匹配结果。我需要添加*或其他什么吗?这是我的代码。

string input = @"<tr class=""row0""><td>09/08/2013</td><td><a href=""/teams/nfl/new-england-patriots/results"">New England Patriots</a></td><td><a href=""/boxscore/2013090803"">L, 23-21</a></td><td align=""center"">0-1-0</td><td align=""right"">65,519</td></tr>";

string pattern = @"(?<=<td>)[^>]*(?=</td>)";
MatchCollection matches = Regex.Matches(input, pattern);
foreach (Match match in matches)
{
    try
    {
        listBoxControl1.Items.Add(matches.ToString());
    }
    catch { }
}

10
不要这样做。那是HTML,不要尝试用正则表达式去处理它。 - pguardiario
2
https://dev59.com/X3I-5IYBdhLWcg3wq6do#1732454 - Sriram Sakthivel
请查看http://nsoup.codeplex.com/,这是JSoup的C#移植版。 - HectorLector
3个回答

9

使用以下正则表达式:

string input = "<tr class=\"row0\"><td>09/08/2013</td><td><a href=\"/teams/nfl/new-england-patriots/results\">New England Patriots</a></td><td><a href=\"/boxscore/2013090803\">L, 23-21</a></td><td align=\"center\">0-1-0</td><td align=\"right\">65,519</td></tr>";

string pattern = "(<td>)(?<td_inner>.*?)(</td>)";

MatchCollection matches = Regex.Matches(input, pattern);

foreach (Match match in matches) {
    try {
        Console.WriteLine(match.Groups["td_inner"].Value);
    }
    catch { }
}

4

HTML(除了XHTML)不是严格的,即在某些情况下

  • 您可以拥有没有结束标记的标签。
  • 您可以拥有嵌套标记。

正则表达式不适用于解析这样复杂的语法。 您需要使用解析器。

使用 htmlagilitypack 解析器

您可以使用此代码使用 HtmlAgilityPack 来检索它

HtmlDocument doc = new HtmlDocument();
doc.Load(yourStream);

var tdList = doc.DocumentNode.SelectNodes("//td")
                  .Select(p => p.InnerText)
                  .ToList();

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接