首页 > 解决方案 > 正则表达式“\d+”选择器一一选择数字

问题描述

我创建了一个需要过滤的字符串的小样本:

https://regex101.com/r/PvXRiC/1

我想从下面的 html 中获取“61”:

<p class="b-list__count__number">
<span>61</span>/
<span>18786</span>
</p>

从我的示例中可以看出,“([\d+])”选择器选择了 6,而 1 是不同的匹配项:

在此处输入图像描述

有什么办法可以在一场比赛中获得“61”?

标签: c#htmlregex

解决方案


您的正则表达式不起作用,因为.*它是一个贪婪的点模式,它一次匹配整行,然后开始回溯,试图容纳一些应该由后续子模式匹配的文本。因此,只有最后一个数字落在第二个捕获组中,因为\d+它可以匹配 1 个数字。

尽管您可以通过.*使用惰性.*?更安全[^<]*?的方式来解决问题,但您不应该使用正则表达式来解析 HTML。

使用HtmlAgilityPack,例如:

var html = "<p class=\"b-list__count__number\">\n<span>61</span>/\n<span>18786</span>\n</p>";
HtmlAgilityPack.HtmlDocument hap;
Uri uriResult;
if (Uri.TryCreate(html, UriKind.Absolute, out uriResult))
{ // html is a URL 
    var doc = new HtmlAgilityPack.HtmlWeb();
    hap = doc.Load(uriResult.AbsoluteUri);
}
else
{ // html is a string
    hap = new HtmlAgilityPack.HtmlDocument();
    hap.LoadHtml(html);
}
var node = hap.DocumentNode.SelectSingleNode("//p[@class='b-list__count__number']");
if (node != null)
{
    Console.Write(node.SelectSingleNode("//span").InnerText); // => 61
}

//p[@class='b-list__count__number']是一个 XPath 表达式,它获取具有属性值的p节点。获取找到的节点的第一个子节点的内部文本。classb-list__count__numbernode.SelectSingleNode("//span").InnerTextspanp


推荐阅读