比如一个网页有img标签如下形式:
<img src="/img/01.jpg" class="c1 c2"/>
要求一条正则匹配img标签的src属性和class属性,
src 和 class 的顺序不是固定的,可能是:
<img class="c1 c2" src="/img/01.jpg" />
也可能是:
<img data-other="abc" class="c1 c2" src="/img/01.jpg" />
或者是:
<img class="c1 c2" data-other="abc" src="/img/01.jpg" />
等等……
唯一能确定的就是:
1.一定是img标签
2.一定有src属性
3.不一定有class属性
4.各个属性的顺序是不一定的
——————————————————————————
目前我的处理办法是:
1.匹配img标签和src属性
<img\b[^<>]*?\bsrc[\s\t\r\n]*=[\s\t\r\n]*[""']?[\s\t\r\n]*(?<imgUrl>[^\s\t\r\n""'<>]*)[^<>]*?/?[\s\t\r\n]*>
2.然后再匹配class属性
class[\s\t\r\n]*=[\s\t\r\n]*[""']?[\s\t\r\n]*(?<imgClass>[^\s\t\r\n""'<>][^"]*)
这样虽然能达到目的,但是分两次匹配,我觉得不方便,所以想一条正则表达式就搞定,但才疏学浅,希望各位大大帮帮忙……
C#正则表达式分组匹配

解决方案 »

  1.   

    用淘宝AIP获取商品信息,商品描述里有图片,类似<img src="/img/01.jpg">,但不仅限于这种,
    然后我想在我的程序上是这样显示的
    <img src="这里可能用他原来的链接或别的什么,所以我要获取src属性" class="我自己的样式,如果他之前没有class属性的话,我就加上我自己的,如果他原来已经有了的话,我就再他后面追加我的样式,所以我要获取class属性"/>
      

  2.   

    (?is)<img(?=[^>]*?src\s*=(['"]?)(?<src>[^'"]+)\1)[^>]*?(class\s*=(['"]?)(?<class>[^'"]+)\3)?[^>]*?>
      

  3.   

    void Main()
    {
    string[] ary=
        {
        @"<img src=""/img/01.jpg"" />",
    @"<img class=""c1 c2"" src=""/img/01.jpg"" />",
    @"<img src=""/img/01.jpg"" class=""c1 c2"" />",
    @"<img class=""c1 c2"" src=""/img/01.jpg"" />",
    @"<img data-other=""abc"" class=""c1 c2"" src=""/img/01.jpg"" />",
    @"<img class=""c1 c2"" data-other=""abc"" src=""/img/01.jpg"" />"
    };
    Regex regSimple=new Regex(@"(?i)<img\b[^>]*?src\s*=(['""]?)(?<src>[^'""]+)\1[^>]*?>");
    Regex reg=new Regex(@"(?i)<img\b(?=[^>]*?src\s*=(['""]?)(?<src>[^'""]+)\1)[^>]*?(class\s*=(['""]?)(?<class>[^'""]+)\3)[^>]*?>");
    foreach(string s in ary)

        if(reg.IsMatch(s))
    {
         Match m =reg.Match(s);
        Console.WriteLine("{0}\t{1}",m.Groups["src"].Value,m.Groups["class"].Value);
    }
    else
    {
        Match m =regSimple.Match(s);
        Console.WriteLine("{0}",m.Groups["src"].Value);
    }
    }
    }
    /*
    /img/01.jpg
    /img/01.jpg c1 c2
    /img/01.jpg c1 c2
    /img/01.jpg c1 c2
    /img/01.jpg c1 c2
    /img/01.jpg c1 c2
    */
      

  4.   

    不行,匹配不到
    <img src="/img/01.jpg" class="c1 c2"/> 
    都匹配不了
      

  5.   

    谢谢,我现在用的方法是下面这种,感觉你给的要美观一点儿,现在就去改改……/// <summary>
            /// 格式化商品描述
            /// </summary>
            /// <param name="htmlHelper"></param>
            /// <param name="desc">商品描述</param>
            /// <returns></returns>
            public static MvcHtmlString FormatDesc(this HtmlHelper htmlHelper, string desc)
            {
                if (!string.IsNullOrWhiteSpace(desc))
                {
                    //<img[^<]*?(class[\s\t\r\n]*=[\s\t\r\n]*[""']?[\s\t\r\n]*[^\s\t\r\n""'<>][^"]*)[^<>]*?/?[\s\t\r\n]*>
                    //<img[^<]*?(src[\s\t\r\n]*=[\s\t\r\n]*[""']?[\s\t\r\n]*[^\s\t\r\n""'<>]*)[^<>]*?/?[\s\t\r\n]*>
                    desc = Regex.Replace(desc, @"<img\b[^<>]*?\bsrc[\s\t\r\n]*=[\s\t\r\n]*[""']?[\s\t\r\n]*(?<imgUrl>[^\s\t\r\n""'<>]*)[^<>]*?/?[\s\t\r\n]*>", new MatchEvaluator(GetNewImageTag));
                }
                return new MvcHtmlString(desc);
            }//替换Img
            private static string GetNewImageTag(Match match)
            {
                string matchValue = match.Value;            try
                {
                    //从image 标签中匹配出URL <img src="http://img03.taobaocdn.com/imgextra/i3/692195348/T2yTGZXm0XXXXXXXXX_!!692195348.jpg">
                    //标记
                    var  = "qwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnm";
                    //整个Img标签
                    var img = match.Value;
                    //检查是否有class属性
                    Match matchImgClass = Regex.Match(img, @"class[\s\t\r\n]*=[\s\t\r\n]*[""']?[\s\t\r\n]*(?<imgClass>[^\s\t\r\n""'<>]*)");
                    var imgClass = matchImgClass.Groups["imgClass"].Value;
                    //Img标签的 src属性
                    var url = match.Groups["imgUrl"].Value;
                    string imgStr = string.Empty;
                    imgStr+="<img ";
                    //如果有class
                    if (!string.IsNullOrWhiteSpace(imgClass))
                    {
                        matchValue = matchValue.Replace(imgClass, imgClass + " lazy img-responsive");
                    }
                    else
                    {
                        imgStr+=" class=\"lazy img-responsive\" ";
                    }
                    imgStr+=" data-original=\"" +  + "\" ";                //matchValue = matchValue.Replace("<img", "<img class=\"lazy img-responsive\" data-original=\"" +  + "\"");
                    matchValue = matchValue.Replace("<img", imgStr);
                    matchValue = matchValue.Replace(url, "/Content/Images/preloader-w8-cycle-black.gif");
                    matchValue = matchValue.Replace(, url);
                    matchValue += "<noscript>" + img + "</noscript>";
                }
                catch
                {            }            return matchValue;
            }