为什么此正则表达式与这些字符串都不匹配?

时间:2018-10-07 16:21:26

标签: c# regex

为什么此正则表达式与以下任何字符串都不匹配?

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>

3 个答案:

答案 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#中转义斜线:))。

Demo

答案 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)