Java中的坑之方括號

Java中的坑之方括號

這一段時間,在作項目的時候,發現了一個坑,這個坑說大不大,說小不小,不知道的足夠喝一壺,知道的就能夠輕鬆解決。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中須要轉義的字符,本人在網上作了個收集,暫時列出如下幾種,防止本身之後再粗枝大葉:

美圓符號$、小括號()、星號*、加號+、點.、方括號[]、問號?、反斜槓\\、異或^、大括號{}、或|、

若是還有,從此再進行補充。

相關文章
相關標籤/搜索