首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

正则有关问题,为何只能匹配到一条数据

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

热点排行