匹配href两个已知字符串之间的任何字符串

时间:2014-08-15 14:28:37

标签: c# regex href

我正在尝试匹配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);

2 个答案:

答案 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)">

这是regex101 demo


或尝试使用Character Classes or Character Sets

<a href="(\/string1\/)([^\/]+)(\/string2)">

我不知道您为什么需要您已经知道的string1string2。您只需要介于

之间的任何字符串

尝试不捕获群组。

详细了解Lookahead and Lookbehind Zero-Length Assertions

(?<=<a href="\/string1\/)[^\/]*(?=\/string2">)

Online demo