C#正则表达式无法匹配任何内容(可能是由于未正确转义字符)

3

我创建了一个正则表达式模式,并在这个网站上进行了测试:http://rubular.com/

我将这个模式粘贴到该网站的第一个框中。

<div class="product clearfix">\n+<div class="img">\n+<a href="(.*?)">\n+<img class="lazyload" id='.*' data-original="(.*?)" alt=".*" title="(.*?)" \/>

我将第二个框框留空。

我的正则表达式模式在这个网站上运行得非常好。

但是我不能在C#中让它工作。

我正在尝试这样做:

WebClient client = new WebClient();

string MainPage = client.DownloadString("http://www.vatanbilgisayar.com/cep-telefonu-modelleri/");

string ItemPattern = "<div class=\"product clearfix\">\\n+" +   //  <div class="product clearfix">\n
                "<div class=\"img\">\\n" +                  //  <div class="img">\n
                "+<a href=\"(.*?)\">\\n" +                  //  +<a href="(.*?)">\n
                "+<img class=\"lazyload\"" +                //  +<img class="lazyload"
                "id='.*' data-original=\"(.*?)\"" +         //  id='.*' data-original="(.*?)"
                "alt=\".*\" title=\"(.*?)\"\\/>";           //  alt=".*" title="(.*?)" \/>

MatchCollection matches = Regex.Matches(MainPage, ItemPattern);

foreach (Match match in matches)
{
    Console.WriteLine("Area Code:        {0}", match.Groups[1].Value);
    Console.WriteLine("Telephone number: {0}", match.Groups[2].Value);
    Console.WriteLine();
}

我只是用 \ 转义了每一个 " 符号。但我真的不明白为什么它没有正常工作,这让我有点发疯了。


你已经成功转义了引号,但是没有转义反斜杠。可以使用原始字符串字面量(@"")来解决这个问题。 - Cameron
你能否写出我应该使用的最终模式?这样对我来说会更容易理解。 - Trax
首先,Jon的帽子不可能这么合适!哦,这里有一个你可能会觉得相关的SO问题https://dev59.com/X3I-5IYBdhLWcg3wq6do - supertopi
你再次匹配什么? - Sam I am says Reinstate Monica
2个回答

4

您需要两层转义序列。您需要先针对c#进行转义,然后再针对正则表达式语法进行一次转义。

如果您想为正则表达式中的字符进行转义,则也必须转义 \ ,因此您应该在正则表达式级别上将 \ 更改为 \\ 以进行转义序列。


你能否写出我应该使用的最终模式?因为我按照您说的尝试了,但它没有起作用。 - Trax
@user2617750 如果您提供了要匹配的文本,那对我来说会更容易些。 - Sam I am says Reinstate Monica
或者使用C#的逐字字符串:@"" - knittl

2

在字符串中,每个单独的\都需要使用两个\进行转义,不包括已经转义过的引号。因为\是一个转义字符。看起来主要是出现了3次"\n"。

原始字符串:

"product clearfix">\n+<div class="img">\n+<a href="(.*?)">\n+<img class="lazyload" id='.*' data-original="(.*?)" alt=".*" title="(.*?)" \/

此外,您可以将其分成多行。C# 忽略空格,所以只需关闭引号并在行尾添加 "+",然后再用另一个引号开始继续下一行。 C#字符串:
string ItemPattern = "<div class=\"product clearfix\">\\n" +   //  <div class="product clearfix">\n
                    "+<div class=\"img\">\\n" +                 //  +<div class="img">\n
                    "+<a href=\"(.*?)\">\\n" +                  //  +<a href="(.*?)">\n
                    "+<img class=\"lazyload\"" +                //  +<img class="lazyload"
                    "id='.*' data-original=\"(.*?)\"" +         //  id='.*' data-original="(.*?)"
                    "alt=\".*\" title=\"(.*?)\"\\/>";           //  alt=".*" title="(.*?)" \/>

如果您仍然遇到问题,那么可能是在 RegEx.Match(mainPage, ItemPattern) 中存在其他错误。根据您进行的调试,似乎字符串已成功创建,但没有 MatchCollection。因此,问题要么出在如何获取匹配项上,要么出在引用它们上。

它不能工作 :( 请进入此网站http://rubular.com/,并输入正则表达式<div class="product clearfix">\n+<div class="img">\n+<a href="(.*?)">\n+<img class="lazyload" id='.*' data-original="(.*?)" alt=".*" title="(.*?)" />。将此网站http://www.vatanbilgisayar.com/cep-telefonu-modelleri/的源代码作为测试字符。然后在页面底部查看匹配组。当我使用此测试字符串在C#中尝试您的解决方案时,它没有匹配任何内容。 - Trax
title="(.?)" /> 或 title="(.?)" /> - peege
刚才对我来说匹配了。我认为原因是在你的原始帖子中,你没有完全按照那样写。就是最后三个字符。我会修改上面的代码。请查看我的最后一条评论,以了解差异所在。 - peege
仍然无法匹配任何内容。我根据您的模式编辑了我的问题中的代码。我正在使用那段代码,但仍然无法匹配任何东西。我真的不明白为什么这不起作用。也许我应该放弃使用正则表达式解析HTML。 - Trax
刚按照你说的检查了一下,没有发现任何问题。它与任何东西都不匹配。MatchCollection为空。 - Trax
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接