C# Regex“\d+&引用;逐个选择数字的选择器
我已经创建了一个需要过滤的字符串小样本: 我想从下面的html中获取“61”:C# Regex“\d+&引用;逐个选择数字的选择器,c#,html,regex,C#,Html,Regex,我已经创建了一个需要过滤的字符串小样本: 我想从下面的html中获取“61”: <p class="b-list__count__number"> <span>61</span>/ <span>18786</span> </p> 61/ 18786 从我的示例中可以看到,“([\d+])选择器正在选择6,而1是不同的匹配: 有什么方法可以在一次匹配中得到“61”吗?您的正则表达式(\n.*)([\d+])的问题在
<p class="b-list__count__number">
<span>61</span>/
<span>18786</span>
</p>
61/
18786
从我的示例中可以看到,“([\d+])选择器正在选择6,而1是不同的匹配:
有什么方法可以在一次匹配中得到“61”吗?您的正则表达式
(\n.*)([\d+])
的问题在于*
是贪婪的,而且还获取最后一个数字以外的所有数字。您可以使用[^\d]*
在第一位停止
(<p class="b-list__count__number">\n<span>[^\d]*)(\d+)
(\n[^\d]*)(\d+)
您的正则表达式不起作用,因为*
是一个贪婪的点模式,一次匹配整行,然后开始回溯,试图容纳一些应该由后续子模式匹配的文本。因此,只有作为\d+
的第二个捕获组中的最后一个数字可以匹配1个数字
尽管您可以通过使用*?
使*
变懒来解决这个问题,或者,您不应该使用正则表达式来解析HTML
例如,使用:
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
}
var html=“\n61/\n18786\n
”;
HtmlAgilityPack.HtmlDocument hap;
Uri结果;
if(Uri.TryCreate(html、UriKind.Absolute、out-uriResult))
{//html是一个URL
var doc=new HtmlAgilityPack.HtmlWeb();
hap=文档加载(uriResult.AbsoluteUri);
}
其他的
{//html是一个字符串
hap=新的HtmlAgilityPack.HtmlDocument();
hap.LoadHtml(html);
}
var node=hap.DocumentNode.SelectSingleNode(//p[@class='b-list\uuuu count\uuuu number']);
如果(节点!=null)
{
Console.Write(node.SelectSingleNode(“//span”).InnerText);//=>61
}
//p[@class='b-list\u count\u number']
是一个XPath表达式,它获取一个p
节点,该节点具有class
属性,该属性具有b-list\u count\u number
值。节点。选择SingleNode(//span”).InnerText
获取找到的p
节点的第一个子节点的内部文本。请参阅。顺便说一句,为什么不使用HtmlAgilityPack正确解析HTML?[\d+]
是“一个数字或一个加号”[\d]+
是“一个或多个数字”。请删除方括号,使其仅为(\d+)
@WiktorStribiżew哦,让我看看HTMLagilityPack您可以使用(\n[^\d]*)(\d+)