这一段时间,在作项目的时候,发现了一个坑,这个坑说大不大,说小不小,不知道的足够喝一壶,知道的就能够轻松解决。java
在作数据统计的时候,碰见了以下形式的数据:bash
[[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); } }
这代码看上去没有任何问题,编译时期也没有报错,但是运行时期就报错了,错误以下:spa
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)
看这错误命名知道是哪一个位置错误了,那么就开始本人的猜测,第一个猜测:难道是不能使用多个字符做为分隔符吗?code
将分隔符选为单个的逗号“,”,分割没有问题。
运行结果以下:字符串
[[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
[[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]]
结果没有问题,这个猜测推翻。it
第二个猜测:应该是个别字符引发的,难道是个别字符不能做为分隔符使用?io
而后又加上了后半个方括号“]”,分隔符如今是这样的“], ”(方括号逗号空格)运行结果以下:编译
[[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中须要转义的字符,本人在网上作了个收集,暂时列出如下几种,防止本身之后再粗枝大叶:
美圆符号$、小括号()、星号*、加号+、点.、方括号[]、问号?、反斜杠\\、异或^、大括号{}、或|、
若是还有,从此再进行补充。