C# 为什么这个正则表达式不';这些字符串都不匹配吗?

C# 为什么这个正则表达式不';这些字符串都不匹配吗?,c#,regex,C#,Regex,为什么这个正则表达式不匹配以下任何字符串 string regx = "<td\\s+class=\"inline-rating-sm\"\\s+data-ci=\"\\d + \">\\s+(\\d+)</td>"; string regx=“\\s+(\\d+”; 测试字符串: <td class="inline-rating-sm" data-ci="943"> (150)</td> <td class="inline-rating

为什么这个正则表达式不匹配以下任何字符串

string regx = "<td\\s+class=\"inline-rating-sm\"\\s+data-ci=\"\\d + \">\\s+(\\d+)</td>";
string regx=“\\s+(\\d+”;
测试字符串:

<td class="inline-rating-sm" data-ci="943"> (150)</td>
<td class="inline-rating-sm" data-ci="922"> (66)</td>
(150)
(66)

因为以下语法在正则表达式中是特殊的:
(…)
,意思是

如果您想逐字匹配括号,您需要转义它们:
\\(
\\)
(我使用双斜杠,首先转义另一个斜杠,因此它转义regex:)中的括号)

您还需要在下面的
中转义
/
,在经过几次更正后,我将呈现模式

您需要将模式修改为:
\s+\(\d+\)
(请记住在C://中转义斜杠)

因为

\"\\d + \">
显式匹配一个
,然后是任意数字,然后是一个空格,然后是另一个空格,然后是
”>
。我想你想要

\"\\d+\">
此外,您没有转义
()
括号,这意味着regex中的捕获组,或者
中的
/

此外,您可能需要使用逐字修改器
@

var regx = @"<td\s+class=""inline-rating-sm""\s+data-ci=""\d+"">\s+\(\d+\)<\/td>";
var regx=@“\s+\(\d+\)”;

无需常量转义,它的可读性更高。

作为基本问题的答案,在许多情况下,匹配它们的表达式是更好的选择,并且可以更简单、更健壮

例如,我使用“工具”->“NuGet Package Manager”->“管理NuGet Packages For Solution…”将HtmlAlityPack添加到一个新项目中,并使用以下方法:

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();

}
static void Main(字符串[]args)
{
字符串h=@“
不是这个
或者这个456
(150) (66)
";
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'和@data ci]”);
//对细胞做点什么。。。
foreach(单元格中的var单元格)
{
Console.WriteLine(cell.GetAttributeValue(“数据ci”,”)+“+cell.InnerText.Trim());
}
Console.ReadLine();
}
要输出:

943(150)
922(66)


我会考虑一个DOM解析库。不要写“正则表达式来匹配字符串”。编写正则表达式的方法基本上是将字符串匹配,转义其中的所有特殊正则表达式符号,然后用表达式替换任何变量内容(如此处的数字)。我还强烈建议使用一些支持正则表达式突出显示的编辑器。在线上有很多regex测试人员可以这样做。这里的详细信息很抱歉,没有起作用。@medoampir请参阅更新:)