情况:
java在使用split切割字符串的时候,偶尔会如下特殊字符串,如下
String aa = "D:/apache-tomcat-7.0.90(2)/wtpwebapps/VedioManage/mp4/test.mp4";
String bb= "D:/apache-tomcat-7.0.90(2)/wtpwebapps/VedioManage/mp4/";
String[] ccs = aa.split(bb);
System.out.println(ccs.length);
System.out.println(ccs[1]);
按照上述代码:字符串"D://apache-tomcat-7.0.90(2)/wtpwebapps/VedioManage/mp4/test.mp4"切割"D://apache-tomcat-7.0.90(2)/wtpwebapps/VedioManage/mp4/"应该切割出长度为2的数组,输出“test.mp4”,
但实际上会报错,因为在字符串中有特殊符号 ( 和 ) ,所以在切割的时候根本匹配不成功,数组长度为1,还是原来的字符串。
解决:
一:添加转义符
这是最简单的办法,给特殊字符前添加转义符,即在上面的 ( ) 前添加 \\ , 变成 \\( 和 \\) ,代码修改后变成
String aa = "D:/apache-tomcat-7.0.90(2)/wtpwebapps/VedioManage/mp4/test.mp4";
String bb= "D:/apache-tomcat-7.0.90\\(2\\)/wtpwebapps/VedioManage/mp4/";
String[] ccs = aa.split(bb);
System.out.println(ccs.length);
System.out.println(ccs[1]);
这样输出就正常了,但是这种方法缺点明显,必须要我们自己操作去转义,如果系统是自动执行的,我们就无法进行手动更改,所有要有个用来转义的工具方法。
二:编写转义工具方法
/**
* 转义字符串中的特殊字符
* @param str 待转义字符串
* @return
*/
public static String turnSpecialString(String str ){
String resStr = "";//容器
for (int i = 0; i < str.length(); i++) {
if( (String.valueOf(str.charAt(i))).equals("(")
|| (String.valueOf(str.charAt(i))).equals(")")
){//当检测出特殊字符时,添加转义符。
resStr = resStr + "\\" + String.valueOf(str.charAt(i));
}else {//非特殊字符直接添加
resStr += String.valueOf(str.charAt(i));
}
}
return resStr;
}
测试 :
String aa = "D:/apache-tomcat-7.0.90(2)/wtpwebapps/VedioManage/mp4/test.mp4";
String bb= "D:/apache-tomcat-7.0.90(2)/wtpwebapps/VedioManage/mp4/";
String bbtrun = turnSpecialString(bb);
String[] ccs = aa.split(bbtrun);
System.out.println(ccs.length);
System.out.println(ccs[1]);
输出成功!
改进:
因为上述的转义方法只转义了 ( 和 ) 两个特殊字符,现实中可能还需要转义其他字符,所以补全转义:
转义的字符包括 ( [ { / ^ - $ ¦ } ] ) ? * + .
/**
* 转义字符串中的特殊字符
* @param str 待转义字符串
* @return
*/
public static String turnSpecialString(String str ){
String resStr = "";//容器
for (int i = 0; i < str.length(); i++) {//转义字符 ( [ { / ^ - $ ¦ } ] ) ? * + .
if( (String.valueOf(str.charAt(i))).equals("(")
|| (String.valueOf(str.charAt(i))).equals("[")
|| (String.valueOf(str.charAt(i))).equals("{")
|| (String.valueOf(str.charAt(i))).equals("/")
|| (String.valueOf(str.charAt(i))).equals("^")
|| (String.valueOf(str.charAt(i))).equals("-")
|| (String.valueOf(str.charAt(i))).equals("$")
|| (String.valueOf(str.charAt(i))).equals("¦")
|| (String.valueOf(str.charAt(i))).equals("}")
|| (String.valueOf(str.charAt(i))).equals("]")
|| (String.valueOf(str.charAt(i))).equals(")")
|| (String.valueOf(str.charAt(i))).equals("?")
|| (String.valueOf(str.charAt(i))).equals("*")
|| (String.valueOf(str.charAt(i))).equals("+")
|| (String.valueOf(str.charAt(i))).equals(".")
){//当检测出特殊字符时,添加转义符。
resStr = resStr + "\\" + String.valueOf(str.charAt(i));
}else {//非特殊字符直接添加
resStr += String.valueOf(str.charAt(i));
}
}
return resStr;
}