dsplit方法定义如下:
public String[] split(String regex, int limit)
第一个参数需要正则字符串。
正则字符串里对于一些特殊的字符需要转义。
错误示范
下面这段代码并不会按照预期工作。
String logLine = "Test [ERROR]: Stack overflow";
String[] arr1 = logLine.split("[ERROR]:", 2);
System.out.println(arr1[0]);
// => Test [ERROR]: Stack overflow
会依然输出原字符串。
正确示范
修改成如下代码:
String logLine = "Test [ERROR]: Stack overflow";
String[] arr1 = logLine.split("\\[ERROR\\]\\:", 2);
System.out.println(arr1[0]);
// => Test
就会输出Test,成功将字符串截断。
问题扩展
问题来了,如何把传入split的字符串自动转义呢?
可以试试这个函数(AI给出)。
private static String escapeSpecialCharacters(String input) {
String regex = "[\\[+\\]+:{}^~?\\\\/()><=\"!]";
return input.replaceAll(regex, "\\\\$0");
}
第一次看到这个函数的时候,你是否和我一样,对这里出现的四个反斜杠\\\\感到疑惑,还有里面的2个反斜杠(中括号前)和双引号前面的一个反斜杠,通用令人摸不着头脑。。。
我试着解释一下:
1、字符串里\",转义了"号,使得可以再双引号里输入双引号。
2、字符串里的\\[,打印的时候会输出为\[,但作为正则字符串,就表示匹配[,因为只输入[会被当作正则的元字符,有特殊的意义,但是如果有匹配单独的[,就必须使用\[,但是\在正则字符里要作为转义字符,必须输入两个\\,所以这里\\[表示要转义[,使得不再是正则的元字符。
3、字符串里的\\\\,其实代表了\\,在打印的时候会输出\\,但出现在正则字符串里,则代表了去匹配字符串里的\,为什么是\\\\去匹配\呢?这是因为两个反斜杠\\代表一个转义反斜杠,反斜杠本身要作为单纯的字符匹配,需要转义一次,这就需要\\,而生成\\则需要在正则字符里输入\\\\才行。
理解上面内容的关键是分清楚目前字符串是是一个普通字符串还是一个正则字符串。