0

我有这样的数据:

<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>?谢谢。

4

6 回答 6

1

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

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

(?<=<a[^>]*>)是一个积极的后向断言,以确保<a[^>]*>在想要的模式之前存在。

(?=</a>)是一个积极的前瞻断言,以确保</a>在模式之后

.*?是一个惰性量词,匹配尽可能少,直到第一个</a>

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

他们的环视解释

于 2012-03-20T06:58:59.277 回答
0

只有一个正则表达式会做:

string pattern = "<a[^>]*>(.*)</a>";
于 2012-03-20T06:32:17.370 回答
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]);
                }

对于这个特定的例子,成功了。仍然不是我想要的。

于 2012-03-20T06:36:38.943 回答
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;
于 2012-03-20T06:56:22.180 回答
0

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

于 2012-03-20T08:32:03.887 回答
0

使用 HTML Agility Pack ( project page , nuget ),这可以解决问题:

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);
于 2012-03-20T10:59:35.073 回答