我正在尝试匹配html页面中的多个href,而我似乎无法使其正常工作。当我使用我的正则表达式时,我得不到匹配。如何将整个href的多个匹配分成两个指定的组?
要匹配的许多样本href:
<a href="/string1/any string here/string2">text here</a>
我的正则表达式代码:
MatchCollection m1 = Regex.Matches(result, @"<a\shref=""(?<url>(\/string1\/).*?(\/string2))"">(?<text>.*?)</a>", RegexOptions.Singleline);
这有效,但匹配hrefs除了我需要的东西之外我不感兴趣:
MatchCollection m1 = Regex.Matches(result, @"<a\shref=""(?<url>(\/string1\/).*?)"">(?<text>.*?)</a>", RegexOptions.Singleline);
答案 0 :(得分:2)
如评论中所述,使用真正的html解析器,如HtmlAgilityPack而不是Regex
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(@"<a href=""/string1/any string here/string2"">text here</a>");
var links = doc.DocumentNode
.SelectNodes("//a[@href]")
.Select(a=>a.Attributes["href"].Value)
.ToList();
或没有xpath
var links = doc.DocumentNode
.Descendants("a")
.Where(a=>a.Attributes["href"]!=null)
.Select(a=>a.Attributes["href"].Value)
.ToList();
答案 1 :(得分:1)
使用Parentheses for Grouping and Capturing
<a href="(\/string1\/)(.*?)(\/string2)">
或尝试使用Character Classes or Character Sets
<a href="(\/string1\/)([^\/]+)(\/string2)">
我不知道您为什么需要您已经知道的string1
和string2
。您只需要介于
尝试不捕获群组。
详细了解Lookahead and Lookbehind Zero-Length Assertions
(?<=<a href="\/string1\/)[^\/]*(?=\/string2">)