使用C#中的regex分组构造获取值

本文关键字:获取 中的 regex 使用 | 更新日期: 2023-09-27 18:25:20

大家好,我对正则表达式很陌生,我正试图从html网页中的img标记中获取srcs值,所以我制作了这个正则表达式:@"<img.*src *=*(['x22'x27])(?<path>.+)('1).*/>"
但是,当我尝试使用以下示例标记从组"path"中获取值时:
<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);

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

使用C#中的regex分组构造获取值

处理html时,最好使用html解析器而不是regex。例如使用HtmlAgilityPack

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

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

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

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