java中怎么替换第二个被匹配到的字符串?

时间:2021-04-12 05:43:30
比如
str="sssegegegsssgege";
想把第二个匹配到的sss给替换掉,替换成hello
结果就是
str="sssegegeghellogege";
应该怎么弄?

11 个解决方案

#1


用正则表达式试试!

#2



String str="sssegegegsssgege";
str=str.replaceAll("(sss)(.*?)(\\1)(.*?)", "$1$2hello$4");
System.out.println(str);

#3


引用 2 楼 suciver 的回复:
Java code?123String str="sssegegegsssgege";str=str.replaceAll("(sss)(.*?)(\\1)(.*?)", "$1$2hello$4");System.out.println(str);

麻烦问一下,为什么这样就不行了?

String str="<table width='750' border='0' align='center' cellpadding='0' cellspacing='0'> \n <tbody> \n  <tr> \n   <td><img src='http://img12.360buyimg.com/cms/g10/M00/06/0A/rBEQWFEwR44IAAAAAAAYg3A04-cAABPFQPR5QAAABib304.jpg' width='750' height='55' alt='' /></td> \n  </tr> \n  <tr> \n   <td> \n    <table width='700' border='0' align='center' cellpadding='0' cellspacing='0' style='border:solid 2px #f2f2f2;'> \n     <tbody> \n      <tr> \n       <td style=' padding:15px 30px;'>可以当长裤又能把裤脚卷起当九分裤来穿,即休闲又不失时尚的工装裤一直流行至今。是潮女们的必备单品之一。</td> \n      </tr> \n     </tbody> \n    </table></td> \n  </tr> \n  <tr> \n   <td height='5'></td> \n  </tr> \n  <tr> \n   <td> \n    <table width='700' border='0' align='center' cellpadding='0' cellspacing='0' bgcolor='#f2f2f2'> \n     <tbody> \n      <tr> \n       <td width='31'>&nbsp;</td> \n       <td width='669' height='30'><strong>材质:</strong>请参考吊牌</td> \n      </tr> \n      <tr> \n       <td>&nbsp;</td> \n       <td height='30'><strong>洗涤说明:</strong>请参考吊牌</td> \n      </tr> \n      <tr> \n       <td>&nbsp;</td> \n       <td height='30'><strong>产地:</strong>中国</td> \n      </tr> \n     </tbody> \n    </table></td> \n  </tr> \n  <tr> \n   <td>&nbsp;</td> \n  </tr> \n  <tr> \n   <td><img src='http://img12.360buyimg.com/cms/g10/M00/06/0A/rBEQWFEwR44IAAAAAAAYg3A04-cAABPFQPR5QAAABib304.jpg' width='750' height='60' alt='' /></td> \n  </tr> \n  <tr> \n   <td> \n    <table width='700' border='0' align='center' cellpadding='5' cellspacing='0' style=' border:solid 1px #ccc;'> \n     <tbody> \n      <tr> \n       <td height='25'> \n        <table width='100%' border='0' align='center' cellpadding='0' cellspacing='0'> \n         <tbody> \n          <tr> \n           <td height='28' align='center' bgcolor='#f2f2f2'>尺码</td> \n           <td align='center' bgcolor='#f2f2f2'>规格</td> \n           <td align='center' bgcolor='#f2f2f2'>身高</td> \n           <td align='center' bgcolor='#f2f2f2'>胸围</td> \n           <td align='center' bgcolor='#f2f2f2'>腰围</td> \n           <td align='center' bgcolor='#f2f2f2'>臀围</td> \n          </tr> \n          <tr> \n           <td height='28' align='center'>2</td> \n           <td align='center'>165/68A</td> \n           <td align='center'>162~170</td> \n           <td align='center'>79~87</td> \n           <td align='center'>64~70</td> \n           <td align='center'>85~90</td> \n          </tr> \n          <tr> \n           <td height='28' align='center' bgcolor='#f2f2f2'>1</td> \n           <td align='center' bgcolor='#f2f2f2'>160/60A</td> \n           <td align='center' bgcolor='#f2f2f2'>156~164</td> \n           <td align='center' bgcolor='#f2f2f2'>72~80</td> \n           <td align='center' bgcolor='#f2f2f2'>58~64</td> \n           <td align='center' bgcolor='#f2f2f2'>79~85</td> \n          </tr> \n          <tr> \n           <td height='28' align='center'></td> \n           <td align='center'>155/60A</td> \n           <td align='center'>150~158</td> \n           <td align='center'>72~80</td> \n           <td align='center'>58~64</td> \n           <td align='center'>79~85</td> \n          </tr> \n         </tbody> \n        </table></td> \n      </tr> \n     </tbody> \n    </table></td> \n  </tr> \n  <tr> \n   <td>&nbsp;</td> \n  </tr> \n </tbody> \n</table> \n<table width='750' border='0' align='center' cellpadding='0' cellspacing='0'> \n <tbody> \n  <tr> \n   <td align='center'> \n    <table width='750' border='0' cellspacing='0' cellpadding='0'> \n     <tbody> \n      <tr> \n       <td><img src='http://img10.360buyimg.com/imgzone/g10/M00/01/11/rBEQWFEGVL8IAAAAAAAXVFimIK0AAATXAKRHjoAABds710.jpg' alt='' /></td> \n      </tr> \n     </tbody> \n    </table> \n    <!-- fwtable fwsrc='未命名' fwbase='MOTO.jpg' fwstyle='Dreamweaver' fwdocid = '622000440' fwnested='0' --> \n    <!-- fwtable fwsrc='未命名' fwbase='MOTO.jpg' fwstyle='Dreamweaver' fwdocid = '622000440' fwnested='0' -->\n    <table width='700' border='0' align='center' cellpadding='0' cellspacing='0'> \n     <!-- fwtable fwsrc='未命名' fwbase='MOTO.jpg' fwstyle='Dreamweaver' fwdocid = '622000440' fwnested='0' --> \n     <tbody> \n      <tr> \n       <td colspan='3'><img src='http://img10.360buyimg.com/imgzone/g10/M00/01/12/rBEQWVEGa7EIAAAAAAAz6jlnfEwAAATiwIimiIAADQC395.jpg' alt='' /></td> \n      </tr> \n      <tr> \n       <td rowspan='2' valign='top'><img src='http://img10.360buyimg.com/imgzone/g10/M00/01/12/rBEQWFEGa8EIAAAAAAAY9_egDuAAAATiwIiziQAABkP173.jpg' alt='' /></td> \n       <td colspan='2'><a href='http://sale.360buy.com/mall/rM5AIWl2FwbxRH.html' target='_blank'><img src='http://img10.360buyimg.com/imgzone/g10/M00/01/11/rBEQWVEGV30IAAAAAAAPKpLkqSQAAATYwGUYB8AAA9C841.jpg' alt='' /></a></td> \n      </tr> \n      <tr> \n       <td><img src='http://img10.360buyimg.com/imgzone/g10/M00/01/11/rBEQWFEGV40IAAAAAAAEuxCovFwAAATSAP_-p0AAAVj591.jpg' width='73' height='58' border='0' id='MOTO_r3_c2' alt='' /></td> \n       <td> \n        <table width='250' height='58' border='0' cellpadding='0' cellspacing='0'> \n         <tbody> \n          <tr> \n           <td background='http://img10.360buyimg.com/imgzone/g10/M00/01/09/rBEQWFEGZkkIAAAAAAACu3AQbdMAAAQVwERntQAAAMi907.jpg'>M</td> \n          </tr> \n         </tbody> \n        </table></td> \n      </tr> \n     </tbody> \n    </table> \n    <table width='750' border='0' cellspacing='0' cellpadding='0'> \n     <tbody> \n      <tr> \n       <td><img src='http://img10.360buyimg.com/imgzone/g10/M00/01/11/rBEQWFEGVL8IAAAAAAAXmaKzx84AAATXAKRxlwAABex782.jpg' alt='' /></td> \n      </tr> \n     </tbody> \n    </table> \n    <table width='700' border='0' cellspacing='0' cellpadding='0'> \n     <tbody> \n      <tr> \n       <td><em> <img src='http://img30.360buyimg.com/popWaterMark/g10/M00/09/11/rBEQWFE9VOgIAAAAAAQdq4dI4IkAAB3dgOPG8QABB3D192.jpg' width='700' height='700' alt='' /><br /> <img src='http://img30.360buyimg.com/popWaterMark/g10/M00/09/11/rBEQWFE9VPEIAAAAAAGMA7EezWAAAB3dwBLh_IAAYwb702.jpg' width='700' height='700' alt='' /> <img src='http://img30.360buyimg.com/popWaterMark/g10/M00/09/11/rBEQWVE9VPkIAAAAAAGTwLvSzVkAAB3dwCmfl0AAZPY092.jpg' width='700' height='700' alt='' /><br /> <img src='http://img30.360buyimg.com/popWaterMark/g10/M00/09/11/rBEQWFE9VPsIAAAAAAFEt8P6lcMAAB3dwDY17wAAUTP532.jpg' width='700' height='700' alt='' /> <img src='http://img30.360buyimg.com/popWaterMark/g10/M00/09/11/rBEQWVE9VQMIAAAAAAGvPnaQ7vYAAB3dwEeX8UAAa9W532.jpg' width='700' height='700' alt='' /><br /> <img src='http://img30.360buyimg.com/popWaterMark/g10/M00/09/11/rBEQWFE9VQYIAAAAAAVtlmlo8icAAB3dwGmAjUABW2u149.jpg' width='700' height='700' alt='' /> <img src='http://img30.360buyimg.com/popWaterMark/g10/M00/09/11/rBEQWFE9VQ0IAAAAAAQVGpIde9AAAB3dwJC_8IABBUy979.jpg' width='700' height='700' alt='' /><br /> <img src='http://img30.360buyimg.com/popWaterMark/g10/M00/09/11/rBEQWVE9VRUIAAAAAAUHamrIhpwAAB3dwKvClUABQeC495.jpg' width='700' height='700' alt='' /> </em></td> \n      </tr> \n     </tbody> \n    </table> \n    <table width='750' border='0' cellspacing='0' cellpadding='0'> \n     <tbody> \n      <tr> \n       <td><img src='http://img10.360buyimg.com/imgzone/g10/M00/01/11/rBEQWVEGVLAIAAAAAAAWqMjKkJkAAATXAKlJJIAABbA067.jpg' alt='' /></td> \n      </tr> \n     </tbody> \n    </table> \n    <table width='700' border='0' align='center' cellpadding='0' cellspacing='0'> \n     <tbody> \n      <tr> \n       <td><img src='http://img10.360buyimg.com/imgzone/g10/M00/01/11/rBEQWFEGVMAIAAAAAABHEPgnBSQAAATXAKlO1IAAEco941.jpg' alt='' /></td> \n      </tr> \n     </tbody> \n    </table> </td> \n  </tr> \n </tbody> \n</table>";
String hello="pp";
String img="http://img12.360buyimg.com/cms/g10/M00/06/0A/rBEQWFEwR44IAAAAAAAYg3A04-cAABPFQPR5QAAABib304.jpg";


// str = str.substring(0,str.lastIndexOf(img)) + str.substring(str.lastIndexOf(img),str.length()).replaceAll(img, hello);
str=str.replaceAll("("+img+")(.*?)(\\1)(.*?)", "$1$2"+hello+"$4");
System.out.println(str);

#4


引用 3 楼 AA5279AA 的回复:
引用 2 楼 suciver 的回复:
Java code?123String str="sssegegegsssgege";str=str.replaceAll("(sss)(.*?)(\\1)(.*?)", "$1$2hello$4");System.out.println(str);
麻烦问一下,为什么这样就不行了?
Java code
?

……

你这里有两个问题,String img="http://img12.360buyimg.com/cms/g10/M00/06/0A/rBEQWFEwR44IAAAAAAAYg3A04-cAABPFQPR5QAAABib304.jpg"
第一你的img里面有特殊字符".",因为"."在正则里面代表匹配任意字符所以img你要改成
String img="http://img12\\.360buyimg\\.com/cms/g10/M00/06/0A/rBEQWFEwR44IAAAAAAAYg3A04\\-cAABPFQPR5QAAABib304\\.jpg";
第二你这个是多行的也就是换行了那么这个
 str=str.replaceAll("("+img+")(.*?)(\\1)(.*?)", "$1$2"+hello+"$4");要加上多行识别
str=str.replaceAll(" (?s)("+img+")(.*?)(\\1)(.*?)", "$1$2"+hello+"$4"); 

#5


正则表达式  分组就搞定了。

#6


正则表达式果然强大。当然如果没有接触过的话,下面这种方法可能更容易理解。


/**
 * 替换第二个匹配的目标子串
 * @param str 源字符串。
 * @param target 需要替换的目标子串。
 * @param replacement 需要替换成的字符串。
 * @return 将源字符串中出现的第二个target换成replacement后的字符串。
 * @throws NullPointerException 当任一参数为空时。
 * @throws Exception 找不到第二个匹配的字符串时。
 */
public static String replaceSecond(String str, String target,
String replacement) throws NullPointerException, Exception {
if (str == null || target == null || replacement == null)
throw new NullPointerException();
int index = str.indexOf(target);
if (index == -1)
throw new Exception("Not Found.");
index = str.indexOf(target, index + target.length());
if (index == -1)
throw new Exception("Not Found.");
String str1 = str.substring(0, index);
String str2 = str.substring(index);
str2 = str2.replaceFirst("sss", "hello");
return str1 + str2;
}

#7


引用 3 楼 AA5279AA 的回复:
引用 2 楼 suciver 的回复:Java code?123String str="sssegegegsssgege";str=str.replaceAll("(sss)(.*?)(\\1)(.*?)", "$1$2hello$4");System.out.println(str);
麻烦问一下,为什么这样就不行了?
Java code?12345678    S……


话说因为你的img里面有需要转义的字符
str=str.replaceAll("(\\Q"+img+"\\E)(.*?)(\\1)(.*?)", "$1$2"+hello+"$4");


\Q \E之间的部分,代表里面的内容全是普通文本的引用,不要把它当作正则看待

#8


引用 6 楼 miaowhehe 的回复:
正则表达式果然强大。当然如果没有接触过的话,下面这种方法可能更容易理解。

Java code?123456789101112131415161718192021222324/** * 替换第二个匹配的目标子串 * @param str 源字符串。 * @param target 需要替换的目标子串。 * @param replacement 需要替换成的字符串。 *……

如果不用正则表达式请看我代码中被注释的那一段。
那段是否更简洁呢?我就是想学学正则。

#9


"(\\Q"+img+"\\E)(.*?)(\\1)(.*?)"

这个最后的?也可以省了吧

#10


引用 8 楼 AA5279AA 的回复:
如果不用正则表达式请看我代码中被注释的那一段。
那段是否更简洁呢?我就是想学学正则。

如果是替换源串中匹配的最后一个子串的话,当然更简洁啦。但这个无法做到替换第二个子串哦。

#11


专门测试了一下,确实是转义的问题,用ResourceBundle读取就不会出现问题了

String table = null;
try {
table = new String(ResourceBundle.getBundle("test").getString("table").getBytes("ISO-8859-1"),"utf-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String img=ResourceBundle.getBundle("test").getString("img");
String hello="pp";
String result=table.replaceAll("("+img+")(.*?)(\\1)(.*?)", "$1$2"+hello+"$4");
System.out.println(result);

#1


用正则表达式试试!

#2



String str="sssegegegsssgege";
str=str.replaceAll("(sss)(.*?)(\\1)(.*?)", "$1$2hello$4");
System.out.println(str);

#3


引用 2 楼 suciver 的回复:
Java code?123String str="sssegegegsssgege";str=str.replaceAll("(sss)(.*?)(\\1)(.*?)", "$1$2hello$4");System.out.println(str);

麻烦问一下,为什么这样就不行了?

String str="<table width='750' border='0' align='center' cellpadding='0' cellspacing='0'> \n <tbody> \n  <tr> \n   <td><img src='http://img12.360buyimg.com/cms/g10/M00/06/0A/rBEQWFEwR44IAAAAAAAYg3A04-cAABPFQPR5QAAABib304.jpg' width='750' height='55' alt='' /></td> \n  </tr> \n  <tr> \n   <td> \n    <table width='700' border='0' align='center' cellpadding='0' cellspacing='0' style='border:solid 2px #f2f2f2;'> \n     <tbody> \n      <tr> \n       <td style=' padding:15px 30px;'>可以当长裤又能把裤脚卷起当九分裤来穿,即休闲又不失时尚的工装裤一直流行至今。是潮女们的必备单品之一。</td> \n      </tr> \n     </tbody> \n    </table></td> \n  </tr> \n  <tr> \n   <td height='5'></td> \n  </tr> \n  <tr> \n   <td> \n    <table width='700' border='0' align='center' cellpadding='0' cellspacing='0' bgcolor='#f2f2f2'> \n     <tbody> \n      <tr> \n       <td width='31'>&nbsp;</td> \n       <td width='669' height='30'><strong>材质:</strong>请参考吊牌</td> \n      </tr> \n      <tr> \n       <td>&nbsp;</td> \n       <td height='30'><strong>洗涤说明:</strong>请参考吊牌</td> \n      </tr> \n      <tr> \n       <td>&nbsp;</td> \n       <td height='30'><strong>产地:</strong>中国</td> \n      </tr> \n     </tbody> \n    </table></td> \n  </tr> \n  <tr> \n   <td>&nbsp;</td> \n  </tr> \n  <tr> \n   <td><img src='http://img12.360buyimg.com/cms/g10/M00/06/0A/rBEQWFEwR44IAAAAAAAYg3A04-cAABPFQPR5QAAABib304.jpg' width='750' height='60' alt='' /></td> \n  </tr> \n  <tr> \n   <td> \n    <table width='700' border='0' align='center' cellpadding='5' cellspacing='0' style=' border:solid 1px #ccc;'> \n     <tbody> \n      <tr> \n       <td height='25'> \n        <table width='100%' border='0' align='center' cellpadding='0' cellspacing='0'> \n         <tbody> \n          <tr> \n           <td height='28' align='center' bgcolor='#f2f2f2'>尺码</td> \n           <td align='center' bgcolor='#f2f2f2'>规格</td> \n           <td align='center' bgcolor='#f2f2f2'>身高</td> \n           <td align='center' bgcolor='#f2f2f2'>胸围</td> \n           <td align='center' bgcolor='#f2f2f2'>腰围</td> \n           <td align='center' bgcolor='#f2f2f2'>臀围</td> \n          </tr> \n          <tr> \n           <td height='28' align='center'>2</td> \n           <td align='center'>165/68A</td> \n           <td align='center'>162~170</td> \n           <td align='center'>79~87</td> \n           <td align='center'>64~70</td> \n           <td align='center'>85~90</td> \n          </tr> \n          <tr> \n           <td height='28' align='center' bgcolor='#f2f2f2'>1</td> \n           <td align='center' bgcolor='#f2f2f2'>160/60A</td> \n           <td align='center' bgcolor='#f2f2f2'>156~164</td> \n           <td align='center' bgcolor='#f2f2f2'>72~80</td> \n           <td align='center' bgcolor='#f2f2f2'>58~64</td> \n           <td align='center' bgcolor='#f2f2f2'>79~85</td> \n          </tr> \n          <tr> \n           <td height='28' align='center'></td> \n           <td align='center'>155/60A</td> \n           <td align='center'>150~158</td> \n           <td align='center'>72~80</td> \n           <td align='center'>58~64</td> \n           <td align='center'>79~85</td> \n          </tr> \n         </tbody> \n        </table></td> \n      </tr> \n     </tbody> \n    </table></td> \n  </tr> \n  <tr> \n   <td>&nbsp;</td> \n  </tr> \n </tbody> \n</table> \n<table width='750' border='0' align='center' cellpadding='0' cellspacing='0'> \n <tbody> \n  <tr> \n   <td align='center'> \n    <table width='750' border='0' cellspacing='0' cellpadding='0'> \n     <tbody> \n      <tr> \n       <td><img src='http://img10.360buyimg.com/imgzone/g10/M00/01/11/rBEQWFEGVL8IAAAAAAAXVFimIK0AAATXAKRHjoAABds710.jpg' alt='' /></td> \n      </tr> \n     </tbody> \n    </table> \n    <!-- fwtable fwsrc='未命名' fwbase='MOTO.jpg' fwstyle='Dreamweaver' fwdocid = '622000440' fwnested='0' --> \n    <!-- fwtable fwsrc='未命名' fwbase='MOTO.jpg' fwstyle='Dreamweaver' fwdocid = '622000440' fwnested='0' -->\n    <table width='700' border='0' align='center' cellpadding='0' cellspacing='0'> \n     <!-- fwtable fwsrc='未命名' fwbase='MOTO.jpg' fwstyle='Dreamweaver' fwdocid = '622000440' fwnested='0' --> \n     <tbody> \n      <tr> \n       <td colspan='3'><img src='http://img10.360buyimg.com/imgzone/g10/M00/01/12/rBEQWVEGa7EIAAAAAAAz6jlnfEwAAATiwIimiIAADQC395.jpg' alt='' /></td> \n      </tr> \n      <tr> \n       <td rowspan='2' valign='top'><img src='http://img10.360buyimg.com/imgzone/g10/M00/01/12/rBEQWFEGa8EIAAAAAAAY9_egDuAAAATiwIiziQAABkP173.jpg' alt='' /></td> \n       <td colspan='2'><a href='http://sale.360buy.com/mall/rM5AIWl2FwbxRH.html' target='_blank'><img src='http://img10.360buyimg.com/imgzone/g10/M00/01/11/rBEQWVEGV30IAAAAAAAPKpLkqSQAAATYwGUYB8AAA9C841.jpg' alt='' /></a></td> \n      </tr> \n      <tr> \n       <td><img src='http://img10.360buyimg.com/imgzone/g10/M00/01/11/rBEQWFEGV40IAAAAAAAEuxCovFwAAATSAP_-p0AAAVj591.jpg' width='73' height='58' border='0' id='MOTO_r3_c2' alt='' /></td> \n       <td> \n        <table width='250' height='58' border='0' cellpadding='0' cellspacing='0'> \n         <tbody> \n          <tr> \n           <td background='http://img10.360buyimg.com/imgzone/g10/M00/01/09/rBEQWFEGZkkIAAAAAAACu3AQbdMAAAQVwERntQAAAMi907.jpg'>M</td> \n          </tr> \n         </tbody> \n        </table></td> \n      </tr> \n     </tbody> \n    </table> \n    <table width='750' border='0' cellspacing='0' cellpadding='0'> \n     <tbody> \n      <tr> \n       <td><img src='http://img10.360buyimg.com/imgzone/g10/M00/01/11/rBEQWFEGVL8IAAAAAAAXmaKzx84AAATXAKRxlwAABex782.jpg' alt='' /></td> \n      </tr> \n     </tbody> \n    </table> \n    <table width='700' border='0' cellspacing='0' cellpadding='0'> \n     <tbody> \n      <tr> \n       <td><em> <img src='http://img30.360buyimg.com/popWaterMark/g10/M00/09/11/rBEQWFE9VOgIAAAAAAQdq4dI4IkAAB3dgOPG8QABB3D192.jpg' width='700' height='700' alt='' /><br /> <img src='http://img30.360buyimg.com/popWaterMark/g10/M00/09/11/rBEQWFE9VPEIAAAAAAGMA7EezWAAAB3dwBLh_IAAYwb702.jpg' width='700' height='700' alt='' /> <img src='http://img30.360buyimg.com/popWaterMark/g10/M00/09/11/rBEQWVE9VPkIAAAAAAGTwLvSzVkAAB3dwCmfl0AAZPY092.jpg' width='700' height='700' alt='' /><br /> <img src='http://img30.360buyimg.com/popWaterMark/g10/M00/09/11/rBEQWFE9VPsIAAAAAAFEt8P6lcMAAB3dwDY17wAAUTP532.jpg' width='700' height='700' alt='' /> <img src='http://img30.360buyimg.com/popWaterMark/g10/M00/09/11/rBEQWVE9VQMIAAAAAAGvPnaQ7vYAAB3dwEeX8UAAa9W532.jpg' width='700' height='700' alt='' /><br /> <img src='http://img30.360buyimg.com/popWaterMark/g10/M00/09/11/rBEQWFE9VQYIAAAAAAVtlmlo8icAAB3dwGmAjUABW2u149.jpg' width='700' height='700' alt='' /> <img src='http://img30.360buyimg.com/popWaterMark/g10/M00/09/11/rBEQWFE9VQ0IAAAAAAQVGpIde9AAAB3dwJC_8IABBUy979.jpg' width='700' height='700' alt='' /><br /> <img src='http://img30.360buyimg.com/popWaterMark/g10/M00/09/11/rBEQWVE9VRUIAAAAAAUHamrIhpwAAB3dwKvClUABQeC495.jpg' width='700' height='700' alt='' /> </em></td> \n      </tr> \n     </tbody> \n    </table> \n    <table width='750' border='0' cellspacing='0' cellpadding='0'> \n     <tbody> \n      <tr> \n       <td><img src='http://img10.360buyimg.com/imgzone/g10/M00/01/11/rBEQWVEGVLAIAAAAAAAWqMjKkJkAAATXAKlJJIAABbA067.jpg' alt='' /></td> \n      </tr> \n     </tbody> \n    </table> \n    <table width='700' border='0' align='center' cellpadding='0' cellspacing='0'> \n     <tbody> \n      <tr> \n       <td><img src='http://img10.360buyimg.com/imgzone/g10/M00/01/11/rBEQWFEGVMAIAAAAAABHEPgnBSQAAATXAKlO1IAAEco941.jpg' alt='' /></td> \n      </tr> \n     </tbody> \n    </table> </td> \n  </tr> \n </tbody> \n</table>";
String hello="pp";
String img="http://img12.360buyimg.com/cms/g10/M00/06/0A/rBEQWFEwR44IAAAAAAAYg3A04-cAABPFQPR5QAAABib304.jpg";


// str = str.substring(0,str.lastIndexOf(img)) + str.substring(str.lastIndexOf(img),str.length()).replaceAll(img, hello);
str=str.replaceAll("("+img+")(.*?)(\\1)(.*?)", "$1$2"+hello+"$4");
System.out.println(str);

#4


引用 3 楼 AA5279AA 的回复:
引用 2 楼 suciver 的回复:
Java code?123String str="sssegegegsssgege";str=str.replaceAll("(sss)(.*?)(\\1)(.*?)", "$1$2hello$4");System.out.println(str);
麻烦问一下,为什么这样就不行了?
Java code
?

……

你这里有两个问题,String img="http://img12.360buyimg.com/cms/g10/M00/06/0A/rBEQWFEwR44IAAAAAAAYg3A04-cAABPFQPR5QAAABib304.jpg"
第一你的img里面有特殊字符".",因为"."在正则里面代表匹配任意字符所以img你要改成
String img="http://img12\\.360buyimg\\.com/cms/g10/M00/06/0A/rBEQWFEwR44IAAAAAAAYg3A04\\-cAABPFQPR5QAAABib304\\.jpg";
第二你这个是多行的也就是换行了那么这个
 str=str.replaceAll("("+img+")(.*?)(\\1)(.*?)", "$1$2"+hello+"$4");要加上多行识别
str=str.replaceAll(" (?s)("+img+")(.*?)(\\1)(.*?)", "$1$2"+hello+"$4"); 

#5


正则表达式  分组就搞定了。

#6


正则表达式果然强大。当然如果没有接触过的话,下面这种方法可能更容易理解。


/**
 * 替换第二个匹配的目标子串
 * @param str 源字符串。
 * @param target 需要替换的目标子串。
 * @param replacement 需要替换成的字符串。
 * @return 将源字符串中出现的第二个target换成replacement后的字符串。
 * @throws NullPointerException 当任一参数为空时。
 * @throws Exception 找不到第二个匹配的字符串时。
 */
public static String replaceSecond(String str, String target,
String replacement) throws NullPointerException, Exception {
if (str == null || target == null || replacement == null)
throw new NullPointerException();
int index = str.indexOf(target);
if (index == -1)
throw new Exception("Not Found.");
index = str.indexOf(target, index + target.length());
if (index == -1)
throw new Exception("Not Found.");
String str1 = str.substring(0, index);
String str2 = str.substring(index);
str2 = str2.replaceFirst("sss", "hello");
return str1 + str2;
}

#7


引用 3 楼 AA5279AA 的回复:
引用 2 楼 suciver 的回复:Java code?123String str="sssegegegsssgege";str=str.replaceAll("(sss)(.*?)(\\1)(.*?)", "$1$2hello$4");System.out.println(str);
麻烦问一下,为什么这样就不行了?
Java code?12345678    S……


话说因为你的img里面有需要转义的字符
str=str.replaceAll("(\\Q"+img+"\\E)(.*?)(\\1)(.*?)", "$1$2"+hello+"$4");


\Q \E之间的部分,代表里面的内容全是普通文本的引用,不要把它当作正则看待

#8


引用 6 楼 miaowhehe 的回复:
正则表达式果然强大。当然如果没有接触过的话,下面这种方法可能更容易理解。

Java code?123456789101112131415161718192021222324/** * 替换第二个匹配的目标子串 * @param str 源字符串。 * @param target 需要替换的目标子串。 * @param replacement 需要替换成的字符串。 *……

如果不用正则表达式请看我代码中被注释的那一段。
那段是否更简洁呢?我就是想学学正则。

#9


"(\\Q"+img+"\\E)(.*?)(\\1)(.*?)"

这个最后的?也可以省了吧

#10


引用 8 楼 AA5279AA 的回复:
如果不用正则表达式请看我代码中被注释的那一段。
那段是否更简洁呢?我就是想学学正则。

如果是替换源串中匹配的最后一个子串的话,当然更简洁啦。但这个无法做到替换第二个子串哦。

#11


专门测试了一下,确实是转义的问题,用ResourceBundle读取就不会出现问题了

String table = null;
try {
table = new String(ResourceBundle.getBundle("test").getString("table").getBytes("ISO-8859-1"),"utf-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String img=ResourceBundle.getBundle("test").getString("img");
String hello="pp";
String result=table.replaceAll("("+img+")(.*?)(\\1)(.*?)", "$1$2"+hello+"$4");
System.out.println(result);