大家好我对正则表达式都很陌生,我试图从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);
感谢大家的关注,请原谅我的英语。
答案 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);
顺便说一下,我在 = 之后添加了一个空格,因为我认为这就是你的意图。您想要 = ,并可选择匹配后面的空格,对吗?您拥有它的方式将匹配零个或多个 = 符号, = 与开头报价之间不允许有空格。