String.split(String regex)意外行为?

时间:2013-02-13 15:57:33

标签: java string

String.split(String delim);表现得很奇怪,它正在返回在每个字符处拆分字符串并返回与String.toCharArray();完全相同的输出[并且它让我疯了]

以下是如何重现我的问题:

System.out.println(Arrays.toString("CENTURY:a,b,c|HALF_CENTURY:c,d,e".split("|")));

输出:[,C,E,N,T,U,R,Y,:,a,,, b ,,, c,|,H,A,L,F,_,C,E,N ,T,U,R,Y,:,c ,,, d ,,, e]

4 个答案:

答案 0 :(得分:5)

String.split(regex)接受正则表达式。在正则表达式世界中|meta character(special character),使用\\将其转义为normal character

Arrays.toString("CENTURY:a,b,c|HALF_CENTURY:c,d,e".split("\\|"));

或将其嵌入character class[|]

Arrays.toString("CENTURY:a,b,c|HALF_CENTURY:c,d,e".split("[|]"));

答案 1 :(得分:1)

"CENTURY:a,b,c|HALF_CENTURY:c,d,e".split("|");

这不起作用,因为split的参数实际上是一个正则表达式,其中|有特殊意义。

原因是split()的参数被编译成正则表达式;和正则表达式中特殊的字符需要引用

反斜杠通常也是字符串的转义字符,需要加倍

试试这个:

"CENTURY:a,b,c|HALF_CENTURY:c,d,e".split("\\|");

答案 2 :(得分:0)

尝试

split("\\|")

你需要逃避|

答案 3 :(得分:0)

您正在寻找Pattern.quote(String)。有关详细信息,请参阅here