原贴和内容:http://community.csdn.net/Expert/TopicView3.asp?id=4341727
在html里面把<a ... href="url" ... >替换成<a ... href="newUrl?address=url" ... >String pat = "(<a\\s+([^>h]|h(?!ref\\b))*href=\")([^\"]*)(\"[^>]*>)";
String html = "aaaa<a jfkdfd d fds sa href=\"sssss\" fds afjdslfd > aaa<a href=\"aaa\">";System.out.println(html.replaceAll(pat, "$1newUrl?address=$3$4"));
=======================================
上面的已解决,还有一个问题
我想判断$3是不是http开头的,是的话newUrl可能不同,怎么做?谢了。

解决方案 »

  1.   

    (<a\s+([^>h]|h(?!ref\b))*href=")((?!http://)[^"]*)("[^>]*>)代码:
    String pat = "(<a\\s+([^>h]|h(?!ref\\b))*href=\")((?!http://)[^\"]*)(\"[^>]*>)";其他的一样。
      

  2.   

    上面的回复是“以http开头的不替换怎么写?”的回答,如果替换不一样的话,是怎样的不一样呢?
      

  3.   

    如果以http开口可能是url1?address=$3$4,不以http开头是url2?address=host$3$4,还有就是上面的正则式如果href=后面的url没有引号或者是单引号怎么替换呢?谢了
      

  4.   

    只替换不是 http:// 开头的:(<a\s+([^>h]|h(?!ref\b))*href=")((?!http://)[^"]*)("[^>]*>)
    ==> $1newUrl_1?address=$3$4代码:
    String pat = "(<a\\s+([^>h]|h(?!ref\\b))*href=\")((?!http://)[^\"]*)(\"[^>]*>)";只替换 是 http:// 开头的(<a\s+([^>h]|h(?!ref\b))*href=")(http://[^"]*)("[^>]*>)
    ==> $1newUrl_2?address=$3$4代码:
    String pat = "(<a\\s+([^>h]|h(?!ref\\b))*href=\")(http://[^\"]*)(\"[^>]*>)";
      

  5.   

    如果href=后面的url没有引号或者是单引号怎么替换呢?谢了
      

  6.   

    如果同时 url1 和 url2 的话,有点复杂,如果没有引号的话,更有点复杂,稍等,我打开 eclipse ……
      

  7.   

    情况比较复杂,具体复杂的地方如下:1. “没有 http:// => url1” 和 “有 http:// => url2” 均要替换,由于替换的内容不同,因此只能运行2次 replaceAll。而第一次替换之后的结果可能会干扰第二次替换。因此,我使用了以临时的记号,为了第二次替换不要去替换第一次已经替换后的结果。2. 有无引号的 2 种情况下,判断 url 的结束方法是不同的:有引号时,以另一个引号配对来决定 url 结束,没有引号时,采用是否遇到空格或者遇到 ">" 符号来决定 url 结束,因此也只能分开进行。------------------------
    综上,我使用了 4 次 replaceAll 来达到目的,分别是(1)有引号有http,(2)有引号无http,(3)无引号有http,(4)无引号无http。我的办法可能比较笨,如果有高人提供更简单的办法,请赐教,不胜感激。
    /* 表达式:(临时标记 temp_re:// 是为了防止干扰)(<a\s+([^>h]|h(?!ref\b))*href=("|'))(http://.*?)(\3[^>]*>)
    ==> $1temp_re://url2?address=$4$5(<a\s+([^>h]|h(?!ref\b))*href=("|'))((?!temp_re://).*?)(\3[^>]*>)
    ==> $1url1?address=$4$5
    (<a\s+([^>h]|h(?!ref\b))*href=(?!"|'))(http://[^\s>]*)([^>]*>)
    ==> $1temp_re://url2?address=$3$4(<a\s+([^>h]|h(?!ref\b))*href=(?!"|'))((?!temp_re://)[^\s>]*)([^>]*>)
    ==> $1url1?address=$3$4
    temp_re://
    ==> ""*/
    String html = "a<a href=http://aaaa>aa<a aaa href=bb aaaa>a<a jfkdfd d fds sa href=\"sssss\" fds afjdslfd >   aaa<a href=\"http://aaa\">  aaa<a href=\"http://aaa\">";String pat1 = "(<a\\s+([^>h]|h(?!ref\\b))*href=(\"|'))(http://.*?)(\\3[^>]*>)";
    html = html.replaceAll(pat1, "$1temp_re://url2?address=$4$5");String pat2 = "(<a\\s+([^>h]|h(?!ref\\b))*href=(\"|'))((?!temp_re://).*?)(\\3[^>]*>)";
    html = html.replaceAll(pat2, "$1url1?address=$4$5");String pat3 = "(<a\\s+([^>h]|h(?!ref\\b))*href=(?!\"|'))(http://[^\\s>]*)([^>]*>)";
    html = html.replaceAll(pat3, "$1temp_re://url2?address=$3$4");String pat4 = "(<a\\s+([^>h]|h(?!ref\\b))*href=(?!\"|'))((?!temp_re://)[^\\s>]*)([^>]*>)";
    html = html.replaceAll(pat4, "$1url1?address=$3$4");// 最后一步是为了把防治干扰的临时标记去掉
    html = html.replaceAll("temp_re://", "");System.out.println(html);
      

  8.   

    可能搞复杂了,等我找到更简单的办法,我继续在这里跟贴。搂主有什么问题可以直接跟我联系,email: [email protected]