正則表達式匹配正確也報錯?

      正則表達式,我想大家都不陌生。Java有,C#有,JavaScript有,其他語言也有,大致的匹配規則都很相似。如果用過正則表達式的開發人員,都覺得這個是個好東西。不過本人在一次獲取一段字符串裏的數字時遇到一個奇怪的問題。代碼如下:

 

 

100,300,400,500,600,700,800,900,
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 32
    at java.lang.StringBuffer.charAt(StringBuffer.java:162)
    at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
    at java.util.regex.Pattern$Curly.match0(Pattern.java:3760)
    at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
    at java.util.regex.Pattern$Start.match(Pattern.java:3055)
    at java.util.regex.Matcher.search(Matcher.java:1105)
    at java.util.regex.Matcher.find(Matcher.java:535)
    at test.PatternTest.main(PatternTest.java:18)

 

得到的結果是這個。開始我覺得好奇怪,爲什麼匹配出來了,回報數組下標越界呢?我試着把字符序列a用toString()方法改爲字符串放到matcher中去匹配,運行以後能匹配而且沒有報錯。怪了,難道說正則匹配的字符序列不能改變麼?於是我查了文檔,發現matcher中的參數是CharSequence 類型的,然後我又找到描述這個接口的文檔,上面說到:

       “CharSequencechar 值的一個可讀序列。此接口對許多不同種類的 char 序列提供統一的只讀訪問。”

      這麼說這個字符序列真的不能改變?於是我又運行了如下代碼:

 

 

結果輸出的是:100,200,300,400,500,600,700,800,900,100,

這我就納悶了,不是說不能改變嗎,怎麼加上一個不報錯呢?其實我也不知道是不是我理解錯誤。於是又試驗瞭如下代碼:

 

 

結果輸入是:100,300,400,500,600,700,800,900,100, 並且沒有報錯,看來真的不是改變字符序列,那麼爲什麼對a用delete方法會報錯呢?我猜想可能是每次正則匹配都會去檢查那個需要匹配的字符序列的長度有沒有改變。那我就來驗證一下,繼續貼代碼

 

 

結果輸出是:兩行100,300,400,500,600,700,800,900,200,和i=9,由此說明,matcher方法每一次匹配都會去檢查被匹配序列的長度,如果長度小於第一次匹配時的字符序列長度,則會報錯。而且i=9也表示,matcher只匹配了9次,即使append兩個200,也只會留下一個,因爲第一次num與匹配值相同是,把100後面的200刪除了,同時在字符序列最後添加了200,等到匹配到第九次,也是最後一個數字時,刪除200,同時再在末尾添加一個200。此時matcher不再匹配,所以不會導致while無限循環。

      所以可以得出結論:正則表達式在匹配取值時,每一次匹配都會檢查原序列長度是否有減少,如果有減少則報錯,並且匹配的字符長度也是不可變的,此長度即爲在創建匹配器時所輸入的字符序列的長度。

      第一次發文章,代碼編輯器用得還不太習慣,有點囧。。。這些都是自己實驗得到的結論,希望大家圍觀,如有錯,還請各位指出,大家一起進步。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章