【问题标题】:Regular Expression in CS: data extractionCS中的正则表达式:数据提取
【发布时间】:2012-03-20 06:23:06
【问题描述】:

我有这样的数据:

<td><a href="/New_York_City" title="New York City">New York</a></td>

我想摆脱纽约

我在正则表达式方面没有任何技能。不过我已经试过了:

StreamReader sr = new StreamReader("c:\\USAcityfile2.txt");
string pattern = "<td>.*</td>";
Regex r = new Regex(pattern, RegexOptions.IgnoreCase);
Regex r1 = new Regex("<a .*>.*</a>", RegexOptions.IgnoreCase);
 string read = "";
while ((read = sr.ReadLine()) != null)
{
    foreach (Match m in r.Matches(read))
    {
        foreach (Match m1 in r1.Matches(m.Value.ToString()))
            Console.WriteLine(m1.Value);
    }
}
sr.Close();
sr.Dispose();

这给了我&lt;a href="/New_York_City" title="New York City"&gt;New York&lt;/a&gt;

如何访问&lt;a .*&gt;&lt;/a&gt; 之间的数据?谢谢。

【问题讨论】:

  • 您的输入数据是格式良好的 XML。也许使用任何 XML 解析器会更好?
  • 对 XML-walking 一无所知。菜鸟是有原因的。 :)

标签: c# regex c#-4.0 data-extraction


【解决方案1】:

如果您坚持针对这种特殊情况使用正则表达式,请尝试以下操作:

String pattern = @"(?<=<a[^>]*>).*?(?=</a>)

(?&lt;=&lt;a[^&gt;]*&gt;) 是一个肯定的后向断言,以确保在想要的模式之前有 &lt;a[^&gt;]*&gt;

(?=&lt;/a&gt;) 是一个肯定的前瞻断言,以确保模式后有&lt;/a&gt;

.*? 是一个惰性量词,匹配尽可能少,直到第一个&lt;/a&gt;

正则表达式的一个很好的参考是regular-expressions.info

Their lookaround explanation

【讨论】:

  • 您有什么要推荐的参考吗?谢谢它有效。
  • @AnubhavSaini 我在答案中添加了两个链接
【解决方案2】:

只有一个正则表达式可以:

string pattern = "<a[^>]*>(.*)</a>";

【讨论】:

  • 试过了。但它给出了
【解决方案3】:
           foreach (Match m1 in r1.Matches(m.Value.ToString()))
                {
                    //Console.WriteLine(m1.Value);
                    string[] res = m1.Value.Split(new char[] {'>','<'});
                    Console.WriteLine(res[2]);
                }

为这个特定的例子做了诀窍。仍然不是我想要的。

【讨论】:

    【解决方案4】:
    var g = Regex.Match(s, @"\<a[^>]+\>([^<]*)").Groups[1];
    

    要在您的文件中查找 &lt;a&gt; 的所有值,您可以使用以下(更简单的)代码:

            var allValuesOfAnchorTag =
                from line in File.ReadLines(filename)
                from match in Regex.Matches(line, @"\<a[^>]+\>([^<]*)").OfType<Match>()
                let @group = match.Groups[1]
                where @group.Success
                select @group.Value;
    

    但是,正如@kirill-polishchuk 正确指出的那样,您似乎使用 XML。如果是真的,代码就更简单了:

            var values = from e in XElement.Load(filename).Descendants("a")
                             select e.Value;
    

    【讨论】:

    • 我猜,您已将代码更改为更简单的代码。 xml 代码抛出错误:有多个根元素。试过:.Descendants("tr").Descendants("td").Descendants("a")
    • @AnubhavSaini,您的输入文档似乎不是 XML。
    • @KirillPolishchuk html 实际上。
    【解决方案5】:

    根据 OP 评论,输入文档是 HTML,最好使用 HTML 解析器,例如:Html Agility Pack。您可以使用 XPath //td/a 来获得想要的结果。

    【讨论】:

      【解决方案6】:

      使用 HTML 敏捷包(project pagenuget),可以解决问题:

      HtmlDocument doc = new HtmlDocument();
      doc.LoadHtml("your html here"); 
      // or doc.Load(stream);
      
      var nodes = doc.DocumentNode.DescendantNodes("a");
      // or var nodes = doc.DocumentNode.SelectNodes("//td/a") ?? new HtmlNodeCollection();
      
      foreach (var node in nodes)
      {
          string city = node.InnerText;
      }
      
      // or var linkTexts = nodes.Select(node => node.InnerText);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多