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>
之间的数据?谢谢
如果您坚持为这种特殊情况使用正则表达式,请尝试以下操作:
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);