我有这样的数据:
<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>
之间覆盖数据?感谢。
答案 0 :(得分:1)
如果您坚持使用此特定案例的正则表达式,请尝试以下操作:
String pattern = @"(?<=<a[^>]*>).*?(?=</a>)
(?<=<a[^>]*>)
是一个积极的后瞻性断言,以确保在所需模式之前有<a[^>]*>
。
(?=</a>)
是一个积极的先行断言,以确保模式后面有</a>
.*?
是一个惰性量词,在第一个</a>
正则表达式的一个很好的参考是regular-expressions.info
答案 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 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);