【问题标题】:Random Bug in a Regexp [duplicate]正则表达式中的随机错误 [重复]
【发布时间】:2013-08-09 15:12:48
【问题描述】:

我正在使用下面的代码在网页中搜索数据并将数据返回给 da datagridview。

当我将它用于包含许多行(如 100)的网页时,有时它会返回一条错误的行 像这样: 考卡亚CE

而且应该只是考卡亚

为什么它只发生在 100 行中的 2 行?

这是我正在搜索的 html http://pastie.org/8220836

{
    int i = 0;
    Match matchLogradouro = Regex.Match(pagina, "<td width=\"268\" style=\"padding: 2px\">(.*)</td>");
    Match matchBairroCidade = Regex.Match(pagina, "<td width=\"140\" style=\"padding: 2px\">(.*)</td>");
    Match matchEstado = Regex.Match(pagina, "<td width=\"25\" style=\"padding: 2px\">([A-Z]{2})</td>");
    Match matchCep = Regex.Match(pagina, "<td width=\"65\" style=\"padding: 2px\">(.*)</td>");
    int z = Regex.Matches(pagina, "detalharCep").Count;
    while (z > i -1)
    {    
        dataGridView1.Rows.Add(matchLogradouro.Groups[1].Value);
        matchLogradouro = matchLogradouro.NextMatch();
        dataGridView1.Rows[i].Cells[1].Value = matchBairroCidade.Groups[1].Value;
        matchBairroCidade = matchBairroCidade.NextMatch();
        dataGridView1.Rows[i].Cells[2].Value = matchBairroCidade.Groups[1].Value;
        matchBairroCidade = matchBairroCidade.NextMatch();
        dataGridView1.Rows[i].Cells[3].Value = matchEstado.Groups[1].Value;
        matchEstado = matchEstado.NextMatch();

        dataGridView1.Rows[i].Cells[4].Value = matchCep.Groups[1].Value;
        matchCep = matchCep.NextMatch();
        i++;
    }
}

【问题讨论】:

  • 我看到很多贪婪的运算符...尝试在每个正则表达式中使用 (.*?)
  • 该死的@Corak,我正要写同样的东西! ^_^ 在那种情况下,总结一下...您是否尝试过使用 XML 解析器? :D
  • @Shaamaan - 这个。或Html Agility Pack
  • 使用 (.*?) 解决了这个问题,但我决定停止偷懒,学习如何使用 Html Agility Pack。来自lazyberezovsky 的例子也有很大帮助!

标签: c# html regex


【解决方案1】:

像这样创建类(对不起,我不懂葡萄牙语,无法理解你的类中应该包含什么样的数据)

public class Foo // I believe it should be something like Address
{
    public string Logradouro { get; set; }
    public string BairroCidade1 { get; set; }
    public string BairroCidade2 { get; set; }
    public string Estado { get; set; } // this should be State
    public string Cep { get; set; }
}

并使用HtmlAgilityPack 解析您的html 文档

HtmlDocument doc = new HtmlDocument();
doc.Load(html_file_name); // or doc.LoadHtml(html_string)

var foos = from row in doc.DocumentNode.SelectNodes("//tr[td]")
           let cells = row.SelectNodes("td").Select(td => td.InnerText).ToArray()
           where cells.Length > 4
           select new Foo {
               Logradouro = cells[0],
               BairroCidade1 = cells[1],
               BairroCidade2 = cells[2],
               Estado = cells[3],
               Cep = cells[4]
           };

【讨论】:

    猜你喜欢
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多