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

本文关键字:数据 提取 正则表达式 CS | 更新日期: 2023-09-27 18:28:32

我有这样的数据:

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

这给了我CCD_ 1。

如何访问<a .*></a>之间的数据?谢谢

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

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

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

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

(?=</a>)是肯定的前瞻断言,以确保在模式之后存在</a>

.*?是一个惰性量词,在第一个</a> 之前尽可能少地匹配

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

他们的环视解释

只有一个Regex可以执行:

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

针对这个特殊的例子,我们做到了。仍然不是我想要的。

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

要在文件中查找<a href="/New_York_City" title="New York City">New York</a>0的所有值,您可以使用以下(更简单)代码:

        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;

根据OP注释,输入文档是HTML,最好使用HTML解析器,例如:HTML敏捷包。您可以使用XPath //td/a来获得所需的结果。

使用HTML敏捷包(项目页面,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);