c# - 正则表达式“\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”?
解决方案
您的正则表达式不起作用,因为.*
它是一个贪婪的点模式,它一次匹配整行,然后开始回溯,试图容纳一些应该由后续子模式匹配的文本。因此,只有最后一个数字落在第二个捕获组中,因为\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
节点。获取找到的节点的第一个子节点的内部文本。class
b-list__count__number
node.SelectSingleNode("//span").InnerText
span
p
推荐阅读
- android - Android 无法使用套接字连接在 WiFi 打印机上打印
- r - 在R编程中为条形图中的变量分配不同的颜色
- user-interface - ClaimCenter Web PCF 文件 UI 标签
- c# - IEnumerable
> 和扩展方法 - spring - Spring Cloud Vault - 缺少必需的标头:X-Config-Token
- refresh - Angular View 不会在数组推送时刷新
- jenkins - 未找到名为 SonarQube Scanner 2.8 的工具错误
- excel - 如果单元格未填充,则停止用户打印
- java - 重定向java spring boot上的cookie创建
- docker - E: 无法在多阶段 Docker 构建中找到包