如何同时匹配src=./xxx/abc.jpg 中的./xxx/。
RegExPattern = @"(?<=.*(src|background)=(""|'))[^<]+/(?=.+)";
上面这个正则表达式可以匹配./xxx/:
src="./xxx/abc.jpg"
src='./xxx/abc.jpg'
但是不能匹配:
src=./xxx/abc.jpg

解决方案 »

  1.   

    稍稍改造了下,楼主用下面的这个试下吧RegExPattern = @"(?<=.*(src|background)=("|')?)[^<"']+/(?=.+)";
      

  2.   

    后来,我改成这样,
    RegExPattern = @"(?<=.*(src|background)=([""']?))[^<]+/(?=.+)";
    结果:
    源串是src="./xxx/abc.jpg"时 匹配得到src=./xxx/" 而不是src="./xxx/"
    源串是src='./xxx/abc.jpg'时 匹配得到src=./xxx/'  而不是src='./xxx/'
    说到底,就是前面那个'或"号去哪里了?
      

  3.   

    错了,还有一个参数没有带。
    RegExPattern = @"(?<=.*(url\(|src|background)=(""|')?)[^<""']+/(?=.+)";
    加了一个url\(
    因为有时候是style="BACKGROUND: url('images/01t01.gif'); "
      

  4.   

    (?:src|background)\s*=\s*["']?(?<vpath>(?:.*/)*)(?<name>[^"'\s>]*)[^>]+?测试:src="./xxx/abc.jpg"
    src='./xxx/abc.jpg'
    src=./xxx/abc.jpg得到3个match
    --------------------------match1
    match: src="./xxx/abc.jpg"
    group["vpath"] = ./xxx
    group["name"] = abc.jpg
    --------------------------match2
    match: src='./xxx/abc.jpg'
    group["vpath"] = ./xxx
    group["name"] = abc.jpg
    --------------------------match3
    match: src=./xxx/abc.jpg
    group["vpath"] = ./xxx
    group["name"] = abc.jpg测试通过:
      

  5.   

    group["vpath"] = ./xxx/  写漏了
      

  6.   

    gzdiablo(),
    你这样的方式可以实现,但是因为程序特殊要求,需要用那种一行解决问题的。还有一个参数没有带。
    RegExPattern = @"(?<=.*(url\(|src|background)=(""|')?)[^<""']+/(?=.+)";
    加了一个url\(,
    因为有时候图片地址会是style="BACKGROUND: url('images/01t01.gif'); "
    但是这个正则表达式好像无法处理url('./xxx/abc.jpg')中的参数哦。
      

  7.   

    给个完整的测试字符串MatchCollection mc = Regex.Matches(yourStr, "(src|background)=([\"']*)(\\./.+?/).+?\\2", RegexOptions.IgnoreCase);
    foreach(Match m in mc)
    {
        m.Groups[3].Value;//./xxx/
    }
      

  8.   

    RegExPattern = @"(?<=.*(url\(|src|background)=(""|')?)[^<""']+/(?=.+)";
    能不能像过客的那种写法?只要能把url('./xxx/abc.jpg')、url("./xxx/abc.jpg")、url(./xxx/abc.jpg)中的对应串取出来就行了。
      

  9.   

    (?:style)\s*=\s*["']?[^'"]*url\s*\([']?(?<vpath>(?:.*/)*)(?<name>[^'\)]*)[^"]*"style单独提取出来处理
      

  10.   

    <TABLE>
    <TR class=tit style="BACKGROUND: url('images/01t01.gif'); ">
    <td width="36"><img border="0" src=images/jjlk11.jpg width="45" height="30"></td>
    </TR>
    <TR class=tit style="BACKGROUND: url("images/01t02.gif"); ">
    <td width="36"><img border="0" src='images/jjlk22.jpg' width="45" height="30"></td>
    </TR>
    <TR class=tit style="BACKGROUND: url(images/01t03.gif); ">
    <td width="36"><img border="0" src="images/jjlk33.jpg" width="45" height="30"></td>
    </TR>
    </TABLE>
      

  11.   

    MatchCollection mc = Regex.Matches(yourStr, "(background\\s*:\\s*url\\(|src=)([\"']*)(.+?\\.(gif|jpg))\\2", RegexOptions.IgnoreCase);
    foreach(Match m in mc)
    {
        m.Groups[3].Value;//url
    }
      

  12.   

    有实例了 测试一下
    用下面这个 呵呵 因为要下班了乱拼的
    (?:style\s*=\s*["']?[^'"]*url\s*\(['"]?(?<vpath>(?:[^/"']*/)*)(?<name>[^'"\)]*)"?[^>]*>|src\s*=\s*["']?(?<vpath>(?:.*/)*)(?<name>[^"'\s> ]*))PS:新年快乐!!
      

  13.   

    不好意思复制错了是这个
    (?:style\s*=\s*["']?[^'"]*url\s*\(['"]?(?<vpath>(?:[^/"']*/)*)(?<name>[^'"\)]*)"?[^>]*>|src\s*=\s*["']?(?<vpath>(?:[^"']*/)*)(?<name>[^"'\s>]*))
      

  14.   

    一楼没有在程序里测试,转义字符书写有误,修正了下并加入了url部分路径的提取
    这个是两种路径同时处理的情况
    MatchCollection mc = Regex.Matches(str, "((src=|url\\()[\"']?)([^\"']+/)(?=.+)", RegexOptions.IgnoreCase);
    foreach (Match m in mc)
    {
         m.Groups[3].Value ;  //路径./xxx/
    }这个是两种情况分别处理的情况
    MatchCollection mc = Regex.Matches(str, "((src=[\"']?)([^\"']+/)(?=.+))|(url\\([\"']?([^\"']+/)(?=.+))", RegexOptions.IgnoreCase);
    foreach (Match m in mc)
    {
       //注意两个不同时有值,其中一个为空,使用时需先判断一下
         m.Groups[3].Value ;  //对应于src=./xxx/abc.jpg的路径./xxx/
         m.Groups[5].Value ;  //对应于url(./xxx/abc.jpg)的路径./xxx/
    }
      

  15.   

    各位大哥,能不能把三种路径表达方式一起处理啊。
    像lxcnn(过客)大哥的那种方式就很好,
    我用过过客大哥的下面的这个表达式,
    part = @"(?<=.*(src|background)=(""|')?)[^<""']+/(?=.+)";
    基本可以实现了:
    <img border="0" src="images/jjlk33.jpg" width="45" height="30">
    和<td background="./xxx/abc.jpg"></td>
    这两种方式的处理,但是:
    我在上面的正则表达式里加入:url\(,却无法处理下面的这种情况:
    part = @"(?<=.*(url\(|src|background)=(""|')?)[^<""']+/(?=.+)";
    无法处理下面这种情况。
    <TR class=tit style="BACKGROUND: url(images/01t03.gif); ">
      

  16.   

    我用两个步骤解决了问题:
    第一步:匹配<TR class=tit style="BACKGROUND: url(images/01t03.gif); ">
    正则表达式:RegExPattern = @"(?<=url\s*\([""'])[^<""']+/(?=.+)";
    第二步:分别匹配<img border="0" src="images/jjlk33.jpg" width="45" height="30">和<td background="./xxx/abc.jpg"></td>
    正则表达式:part = @"(?<=.*(url\(|src|background)=(""|')?)[^<""']+/(?=.+)";mobydick(敌伯威|我排著队拿著爱的号码牌)和gzdiablo() 的方法不错,
    但是比起我要实现的这个来,要复杂一些。
    过客开始的想法和我是一致的,但是后来就变了。
    我一直在郁闷,为什么不能用一个步骤解决呢?
      

  17.   

    当然能用一个步骤解决,只不过你没有一次是把需要匹配的内容说全的,每次都是我们解决了一种情况你又加一种,最好能一次把所出现的情况说全了,下面是你所说的三种情况,一步匹配的正则MatchCollection mc = Regex.Matches(str, "((src=|background=|url\\()[\"']?)([^\"']+/)(?=.+)", RegexOptions.IgnoreCase);
    foreach (Match m in mc)
    {
         m.Groups[3].Value ;  //路径./xxx/
    }
      

  18.   

    vb.net.....PS:我的本来就是2步的 只是我偷懒合到一起了
    第一:
    style\s*=\s*["']?[^'"]*?url\s*\(['"]?(?<vpath>(?:[^/"']*/)*)(?<name>[^'"\)]*)"?[^>]*>
    第二:
    src\s*=\s*["']?(?<vpath>(?:[^"']*/)*)(?<name>[^"'\s>]*)呵呵 着急下班偷懒了