Java中字符串按照$符号和$$符号进行分割的不同方法

165 阅读1分钟

开发过程中遇到这样一个问题,当一个字符串中需要以$等特殊符号进行分割时,如果按照传统的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

与以两个$$符号进行分割的结果一致。