C#正则表达式无法匹配任何东西(可能是因为无法正确转义字符)

时间:2014-12-15 22:43:08

标签: c# regex

我制作了一个正则表达式模式并在此网站中进行了测试: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();
}

我只是逃脱了每一次&#34;用\。我真的不明白为什么它不工作,这开始让我发疯...

2 个答案:

答案 0 :(得分:4)

您需要2层转义序列。您需要为c#转义一次,并再次转义正则表达式语法。

如果您想要转义正则表达式的字符也必须转义\,那么您应该在正则表达式级别将转义序列的\更改为\\

答案 1 :(得分:2)

对字符串中的每个\使用两个\。不计算你已经为报价做的逃避。因为\是一个转义字符。看起来主要与&#34; \ n&#34;发生了3次。

原始字符串:

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

此外,您可以将其分解为多行。 c#忽略空格,所以只需关闭引号并添加&#34; +&#34;到最后一行,继续从另一个引号开始。

C#String:

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。所以,无论是你如何获得比赛,还是参考比赛。