开发过程中遇到这样一个问题,当一个字符串中需要以$等特殊符号进行分割时,如果按照传统的String.split("$")方法,得到的答案是有问题的,例子如下
String test = "number$1706200845657329666$xxxx";
String[] ss = test.split("$");
for (int i = 0;i < ss.length;i++) {
System.out.println(ss[i]);
}
得到的结果为
number$1706200845657329666$xxxx
这和我们想得到的数组答案不同,原因就是特殊符号需要进行转义,因此调整为
String test = "number$1706200845657329666$xxxx";
String[] ss = test.split("\\$");
for (int i = 0;i < ss.length;i++) {
System.out.println(ss[i]);
}
得到的结果如下
number
1706200845657329666
xxxx
这就是我们想要的结果了
如果分割标志为$$时,我们首先尝试一下\\$分割出来的结果
首先代码如下
String test = "number$$1706200845657329666$$xxxx";
String[] ss = test.split("\\$");
for (int i = 0;i < ss.length;i++) {
System.out.println(ss[i]);
}
得到的结果为
number
1706200845657329666
xxxx
可以看到结果虽然是分割开了,但数组并不完全是我们想要的情况,字符串数组中出现了空白元素。那么如果以\\$$进行分割呢,代码如下
String test = "number$$1706200845657329666$$xxxx";
String[] ss = test.split("\\$$");
for (int i = 0;i < ss.length;i++) {
System.out.println(ss[i]);
}
结果为
number$$1706200845657329666$$xxxx
可以看到比刚刚的结果更差了,又回到第一种情况去了
经过一番查找,发现Google Guava库有一种字符串分割方式在面对这种情况时非常好用,代码如下
String test = "number$$1706200845657329666$$xxxx";
List<String> ss = Splitter.on("$$")
.trimResults()
.omitEmptyStrings()
.splitToList(test);
for (int i = 0;i < ss.size();i++) {
System.out.println(ss.get(i));
}
得到的结果如下
number
1706200845657329666
xxxx
事实上,该方法首先利用on()方法定义了分割符,trimResults()方法删除了元素前后的所有空白字符串,omitEmptyStrings()确定不考虑空元素,splitToList()创建了包含元素的列表。
题外话:尝试使用$符号利用Google Guava库的方法进行分割会出现什么样的情况呢?结果如下
number
1706200845657329666
xxxx
与以两个$$符号进行分割的结果一致。