日期:2014-05-18  浏览次数:20621 次

一个貌似比较麻烦的正则问题,求解决方法
先看代码:

String fname= "b[1].jpg";//当fname中含有正则的关键字符时,替代就无效了,b(1).jpg也是无效
String text= "file\\a.jpg|file\\b[1].jpg|file\\c.jpg";
 text= text.replaceAll("file\\\\" + fname+ "[\\|]?", "");
 System.out.println(text);


我想要替代text字符串的,含fname名字的字符串:file\fname 为空,当fname的值不为正则的关键字母时,替代正常,含有()、[]等时,就替换不了,怎么办呢?请高人指教。
当然了,fname是动态可变了,甚至为何值并不知道,这里只是测试实例,即答:fname= "b[1].jpg"改为:
fname= "b\\[1\\].jpg之类的不合要求。

------解决方案--------------------
这样吧
	public static void main(String[] args) {
String fname = "b[1].jpg";
fname = fname.replace("[", "\\[").replace("]","\\]");
String text = "file\\a.jpg
------解决方案--------------------
file\\b[1].jpg
------解决方案--------------------
file\\c.jpg";
text = text.replaceAll("file\\\\" + fname + "\\
------解决方案--------------------
", "");
System.out.println(text);
}

------解决方案--------------------
或者直接用replace
text = text.replace("file\\" + fname + "
------解决方案--------------------
", "");

不过这样有多个的话只能替换掉一个
------解决方案--------------------
引用:
上面说了,这里只是测试实例啊,不是单单解决这个问题,要解决这系列问题,fname是个变量,我这里值为b[1].jpg,实际上各种值都可能有,如:b(1).jpg,b(1)(2)[1][3][sss(.jpg,等等,甚至还有$%{}^等等字符,有没个通用的解决方法呢?

你实际上市想把fname当成正则表达式去替换,这样的话,你就必须把所有的正则元字符替换成加\进行转义的。要么你就补用正则,用
------解决方案--------------------
分割你这个字符串,遍历,进行重新拼接
------解决方案--------------------
老打错别字
------解决方案--------------------
也没几行代码吧,拆分组装一下
------解决方案--------------------
可以用这样一句话把你要替换元字符给替换掉
fname = fname.replaceAll("([\\[\\]()])", "\\\\$1");

------解决方案--------------------
直接replaceALL,没必要正则