這一段時間,在作項目的時候,發現了一個坑,這個坑說大不大,說小不小,不知道的足夠喝一壺,知道的就能夠輕鬆解決。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中須要轉義的字符,本人在網上作了個收集,暫時列出如下幾種,防止本身之後再粗枝大葉:
美圓符號$、小括號()、星號*、加號+、點.、方括號[]、問號?、反斜槓\\、異或^、大括號{}、或|、
若是還有,從此再進行補充。