Java中的坑之方括号

原创
2018/08/22 13:00
阅读数 3.1K

Java中的坑之方括号

这一段时间,在做项目的时候,发现了一个坑,这个坑说大不大,说小不小,不知道的足够喝一壶,知道的就可以轻松解决。

问题描述

在做数据统计的时候,遇见了如下形式的数据:

[[2018-08-16 09:05:39, 2018-08-16 10:40:56], [2018-08-16 11:00:05, 2018-08-16 13:05:06], [2018-08-16 15:06:30, 2018-08-16 19:45:36]]

这是一条字符串,需要对这个字符串进行处理,提取出时间段,不要日期。那么这个应该很好处理的了,写一个方法,直接对字符串进行分割就ok了,那么接下来是本人写的方法:

    public static void main(String[] args) {
        String data="[[2018-08-16 09:05:39, 2018-08-16 10:40:56], [2018-08-16 11:00:05, 2018-08-16 13:05:06], [2018-08-16 15:06:30, 2018-08-16 19:45:36]]";
        String[] string=data.split("], [");
        for (String string2 : string) {
            System.out.println(string2);
        }
}

这代码看上去没有任何问题,编译时期也没有报错,可是运行时期就报错了,错误如下:

Exception in thread "main" java.util.regex.PatternSyntaxException: Unclosed character class near index 3
], [
   ^
    at java.util.regex.Pattern.error(Unknown Source)
    at java.util.regex.Pattern.clazz(Unknown Source)
    at java.util.regex.Pattern.sequence(Unknown Source)
    at java.util.regex.Pattern.expr(Unknown Source)
    at java.util.regex.Pattern.compile(Unknown Source)
    at java.util.regex.Pattern.<init>(Unknown Source)
    at java.util.regex.Pattern.compile(Unknown Source)
    at java.lang.String.split(Unknown Source)
    at java.lang.String.split(Unknown Source)
    at cn.com.xh.test.Test01.main(Test01.java:7)

猜想

看这错误命名知道是哪个位置错误了,那么就开始本人的猜想,第一个猜想:难道是不能使用多个字符作为分隔符吗?

将分隔符选为单个的逗号“,”,分割没有问题。
运行结果如下:

[[2018-08-16 09:05:39
 2018-08-16 10:40:56]
 [2018-08-16 11:00:05
 2018-08-16 13:05:06]
 [2018-08-16 15:06:30
 2018-08-16 19:45:36]]

接着我又将逗号后面的空格添加上,分隔符就为一个逗号,一个空格了,运行结果如下:

[[2018-08-16 09:05:39
2018-08-16 10:40:56]
[2018-08-16 11:00:05
2018-08-16 13:05:06]
[2018-08-16 15:06:30
2018-08-16 19:45:36]]

结果没有问题,这个猜想推翻。

第二个猜想:应该是个别字符引起的,难道是个别字符不能作为分隔符使用?

然后又加上了后半个方括号“]”,分隔符现在是这样的“], ”(方括号逗号空格)运行结果如下:

[[2018-08-16 09:05:39, 2018-08-16 10:40:56
[2018-08-16 11:00:05, 2018-08-16 13:05:06
[2018-08-16 15:06:30, 2018-08-16 19:45:36]]

运行又没有问题,正是这个结果的出现,误导了本人,本人当时的想法是,后半个方括号没问题,前半个应该也没有问题,然后就没有进行前半个的测试。
全部写上又报错,是不是要疯了。问题究竟出现在哪里了呢?

最终猜想:测试一下前半个方括号吧。

在百思不得其解的情况下,我将分隔符设为了单个的前半个方括号,运行结果如下:

Exception in thread "main" java.util.regex.PatternSyntaxException: Unclosed character class near index 0
[
^
    at java.util.regex.Pattern.error(Unknown Source)
    at java.util.regex.Pattern.clazz(Unknown Source)
    at java.util.regex.Pattern.sequence(Unknown Source)
    at java.util.regex.Pattern.expr(Unknown Source)
    at java.util.regex.Pattern.compile(Unknown Source)
    at java.util.regex.Pattern.<init>(Unknown Source)
    at java.util.regex.Pattern.compile(Unknown Source)
    at java.lang.String.split(Unknown Source)
    at java.lang.String.split(Unknown Source)
    at cn.com.xh.test.Test01.main(Test01.java:7)

错误很明显了,那就是前半个方括号引起的,那么是什么问题引起了前半个括号不能作为分隔符呢?也不是不能作为分隔符,而是需要转义,这就是我上面说的误导的意思,一个括号,前半截需要转义,后半截不需要转义,是不是很坑?而且本人先用的还是后半截。
当本人把代码改为如下这样,运行就完全没有问题了。

    public static void main(String[] args) {
        String data="[[2018-08-16 09:05:39, 2018-08-16 10:40:56], [2018-08-16 11:00:05, 2018-08-16 13:05:06], [2018-08-16 15:06:30, 2018-08-16 19:45:36]]";
        String[] string=data.split("], \\[");
        for (String string2 : string) {
            System.out.println(string2);
        }
}

运行结果如下:

[[2018-08-16 09:05:39, 2018-08-16 10:40:56
2018-08-16 11:00:05, 2018-08-16 13:05:06
2018-08-16 15:06:30, 2018-08-16 19:45:36]]

总结

针对方括([])使用的时候,最好是都加上转义字符,这样就不至于出现这么微小的错误,虽然这个错误不是很大,但是很闹心,稍不留神就会浪费时间在这上面,上面也是出现问题解决的一个思路。

针对java中需要转义的字符,本人在网上做了个收集,暂时列出以下几种,防止自己以后再粗心大意:

美元符号$、小括号()、星号*、加号+、点.、方括号[]、问号?、反斜杠\\、异或^、大括号{}、或|、

如果还有,今后再进行补充。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
2 收藏
2
分享
返回顶部
顶部