正则问题,为何只能匹配到一条数据string sss img width\499\ height\323\ title\asdfsadfasdf
正则问题,为何只能匹配到一条数据
string sss = "<img width="499" height="323" title="asdfsadfasdf" alt="" src="http://images.xxxxxx.cn/2013/0522/20130522113854351.jpg" border="0" longdesc="asdfasdfsadfasdf" /><img width="499" height="323" title="asdfsadfasdf" alt="" src="http://images.xxxxxx.cn/2013/0522/20130522113854351.jpg" border="0" longdesc="asdfasdfsadfasdf" /><img width="499" height="323" title="asdfsadfasdf" alt="" src="http://images.xxxxxx.cn/2013/0522/20130522113854351.jpg" border="0" longdesc="asdfasdfsadfasdf" /><img width="499" height="323" title="asdfsadfasdf" alt="" src="http://images.xxxxxx.cn/2013/0522/20130522113854351.jpg" border="0" longdesc="asdfasdfsadfasdf" /><img width="499" height="323" title="asdfsadfasdf" alt="" src="http://images.xxxxxx.cn/2013/0522/20130522113854351.jpg" border="0" longdesc="asdfasdfsadfasdf" />";
string pattern = "<img.*title="(?<Title>.+?)".*src="(?<SRC>.+?)".*longdesc="(?<DESC>.+?)" />";
string title = string.Empty;
string src = string.Empty;
string longdesc = string.Empty;
StringBuilder js = new StringBuilder();
Regex rr = new Regex(pattern, RegexOptions.IgnoreCase);
MatchCollection matches = rr.Matches(sss);
int i = 1;
foreach (Match match in matches)
{
title = match.Groups["Title"].Value;
src = match.Groups["SRC"].Value;
longdesc = match.Groups["DESC"].Value;
js.Append("<li>");
js.Append("<a href="javascript:void(0);">");
js.Append("<img src="" width="120" height="80" alt="" + title + "" />");
js.Append("</a>");
js.Append("</li>");
i++;
}
Response.Write(matches.Count.ToString()+"<br />");
Response.Write(js.ToString());
只能匹配到字符串的第一个img,后面的匹配不到,请高手做下修改。谢谢!
[解决办法]
正则表达式默认情况下在匹配时是贪婪的,换句话说,就是当字符符合所匹配的模式时,会被包含在内,在你的例子中,当碰到第一个.*时,会匹配至最后一个字符,之后发现不符合下一个匹配项t(title中的第一个字符),又开始回溯,这样最终只然找到一个。
如果你在第一个 .*中加一个捕获,你就可以看出结果。
改进的办法就是加一个?号,表示最少匹配:
string pattern = "<img.*?title="(?<Title>.+?)".*?src="(?<SRC>.+?)".*?longdesc="(?<DESC>.+?)"?/>";
