正则问题,为何只能匹配到一条数据
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>.+?)\"?/>";