为什么此正则表达式与以下任何字符串都不匹配?
string regx = "<td\\s+class=\"inline-rating-sm\"\\s+data-ci=\"\\d + \">\\s+(\\d+)</td>";
测试字符串:
<td class="inline-rating-sm" data-ci="943"> (150)</td>
<td class="inline-rating-sm" data-ci="922"> (66)</td>
答案 0 :(得分:1)
因为
\"\\d + \">
明确匹配"
,然后匹配任意数字,然后匹配一个或多个空格,然后匹配另一个空格,然后匹配">
。我想你要
\"\\d+\">
此外,您没有转义()
括号,这意味着正则表达式中的捕获组或/
中的</td>
。
您还可能希望使用逐字修饰符@
。
var regx = @"<td\s+class=""inline-rating-sm""\s+data-ci=""\d+"">\s+\(\d+\)<\/td>";
在不进行常量\\
转义的情况下更具可读性。
答案 1 :(得分:0)
因为以下语法在正则表达式中是 special :(...)
,表示capturing group。
如果您想在字面上匹配括号,则需要转义它们:\\(
和\\)
(我使用双斜杠,首先是转义另一个斜杠,因此它在正则表达式中转义了:)))
您还需要在进行一些更正后,在我提出的模式下方的/
中逃避</td>
。
您需要将模式修改为:<td\s+class="inline-rating-sm"\s+data-ci="\d*">\s+\(\d+\)<\/td>
(记住在C#中转义斜线:))。
答案 2 :(得分:-1)
作为对潜在问题的解答,在许多情况下,匹配它们的XPath表达式是一个更好的选择,并且可以更简单,更可靠。
例如,我通过“工具”->“ NuGet程序包管理器”->“管理解决方案的NuGet程序包...”将HtmlAgilityPack添加到新项目中,并使用了它:
static void Main(string[] args)
{
string h = @"<html><head><title></title></head><body>
<table class=""table"">
<tr><th scope=""row"">Not this</th><td>123</td></tr>
<tr><th scope=""row"">Or this</th><td>456</td></tr>
<tr><td class=""inline-rating-sm"" data-ci=""943""> (150)</td><td class=""inline-rating-sm"" data-ci=""922""> (66)</td></tr>
</table>
</body></html>";
var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(h);
var table = doc.DocumentNode.SelectSingleNode(@"//table[@class='table']");
var cells = table.SelectNodes(@".//td[@class='inline-rating-sm' and @data-ci]");
// do something with the cells...
foreach (var cell in cells)
{
Console.WriteLine(cell.GetAttributeValue("data-ci", "") + " " + cell.InnerText.Trim());
}
Console.ReadLine();
}
输出:
943(150)
922(66)