CS中的正则表达式:数据提取

时间:2012-03-20 06:23:06

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

我有这样的数据:

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

这给了我<a href="/New_York_City" title="New York City">New York</a>

如何在<a .*></a>之间覆盖数据?感谢。

6 个答案:

答案 0 :(得分:1)

如果您坚持使用此特定案例的正则表达式,请尝试以下操作:

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

(?<=<a[^>]*>)是一个积极的后瞻性断言,以确保在所需模式之前有<a[^>]*>

(?=</a>)是一个积极的先行断言,以确保模式后面有</a>

.*?是一个惰性量词,在第一个</a>

之前尽可能地匹配

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

Their lookaround explanation

答案 1 :(得分:0)

只有一个Regex会这样做:

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

答案 2 :(得分:0)

           foreach (Match m1 in r1.Matches(m.Value.ToString()))
                {
                    //Console.WriteLine(m1.Value);
                    string[] res = m1.Value.Split(new char[] {'>','<'});
                    Console.WriteLine(res[2]);
                }

对于这个特殊的例子,有没有诀窍。仍然不是我在想什么。

答案 3 :(得分:0)

var g = Regex.Match(s, @"\<a[^>]+\>([^<]*)").Groups[1];

要查找文件中<a>的所有值,您可以使用以下(更简单)的代码:

        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;

答案 4 :(得分:0)

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

答案 5 :(得分:0)

使用HTML Agility Pack(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);