0

大家好,我对正则表达式很陌生,我正在尝试从 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);

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

4

2 回答 2

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();
于 2013-07-29T20:43:10.903 回答
1

用正则表达式回答,问题只是你在 中使用了一个贪婪的量词(?<path>.+),所以它与你想要的最后一个引号匹配,而不是一个。让它不贪心:

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

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

于 2013-07-29T20:50:25.117 回答