Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Regex“\d+&引用;逐个选择数字的选择器_C#_Html_Regex - Fatal编程技术网

C# Regex“\d+&引用;逐个选择数字的选择器

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+])的问题在

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

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

<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+)