使用C#中的正则表达式分组构造获取值

时间:2013-07-29 20:34:50

标签: c# regex

大家好我对正则表达式都很陌生,我试图从html网页中的img标签中获取srcs值,所以我做了这个正则表达式:@"<img.*src *=*([\x22\x27])(?<path>.+)(\1).*/>"
但是,当我尝试使用此示例标记获取组“路径”时的值:
<img src='kkkkkk' class='icon' alt='' />
我得到kkkkkk' class='icon' alt='而不是kkkkkk。我只是想不出来。
这是我用于提取和打印数据的代码:

Regex SrcRegex = new Regex(@"<img.*src *=*([\x22\x27])(?<path>.+)(\1).*/>", RegexOptions.IgnoreCase);

string TestTag = "<img src='kkkkkk' class='icon' alt='' />";

MatchCollection MatchedString = SrcRegex.Matches(ReadIn);

foreach (Match M in MatchedString)
        Console.WriteLine(M.Groups["path"].Value);

感谢大家的关注,请原谅我的英语。

2 个答案:

答案 0 :(得分:1)

处理html时,最好使用html解析器而不是正则表达式。例如,使用HtmlAgilityPack

var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(htmlstring);

var imgUrls = doc.DocumentNode.Descendants("img")
                .Select(img => img.Attributes["src"].Value)
                .ToList();

答案 1 :(得分:1)

要用正则表达式来回答,问题只是你在(?<path>.+)中使用贪心量词,因此它与 last 引用相匹配,而不是 next < / em>一个,如你所愿。只是让它不贪婪:

Regex SrcRegex = new Regex(@"<img.*src *= *([\x22\x27])(?<path>.+?)(\1).*/>", RegexOptions.IgnoreCase);

顺便说一下,我在 = 之后添加了一个空格,因为我认为这就是你的意图。您想要 = ,并可选择匹配后面的空格,对吗?您拥有它的方式将匹配零个或多个 = 符号, = 与开头报价之间不允许有空格。