2013-02-12 49 views
234

爲什麼Java代碼中的第二行會拋出ArrayIndexOutOfBoundsExceptionJava字符串以「。」分隔(dot)

String filename = "D:/some folder/001.docx"; 
String extensionRemoved = filename.split(".")[0]; 

儘管下面的工作:

String driveLetter = filename.split("/")[0]; 

我用Java 7

+1

不分裂使用正則表達式字符串?在這種情況下 」。」意味着任何角色。 – Snps 2013-02-12 12:53:46

+2

...這是一個DOUBLE反斜線來分隔。 – Ben 2013-12-06 05:41:29

回答

513

你需要躲避點,如果你想拆就一個文字點:

String extensionRemoved = filename.split("\\.")[0]; 

否則,你在拆分正則表達式.,它意味着「任何角色」。
請注意在正則表達式中創建單個反斜槓所需的雙反斜槓。


你得到一個ArrayIndexOutOfBoundsException因爲你的輸入字符串就是一個點,即".",這是產生上時分裂點空數組邊界情況; split(regex)從結果中刪除所有尾隨空白,但由於拆分點上的點只留下兩個空白,刪除尾隨空白後,您將剩下一個空數組。

爲避免爲此邊緣案例獲得ArrayIndexOutOfBoundsException,請使用split(regex, limit)的重載版本,該版本的第二個參數是所得數組的大小限制。當limit,從結果數組去除尾隨空白的行爲被禁止:

".".split("\\.", -1) // returns an array of two blanks, ie ["", ""] 

即當filename只是一個點".",呼籲filename.split("\\.", -1)[0]將返回一個空白,但調用filename.split("\\.")[0]將拋出ArrayIndexOutOfBoundsException

+1

請注意,文件名可以包含多個點。必須使用「。」的最後一個索引。並使用它來查找文件名的子字符串。 – saurabheights 2017-06-12 14:24:07

+0

@saurabheights問題不是關於正確的正則表達式,而是爲什麼有一個'ArrayIndexOutOfBoundsException'。也就是說,你是不正確的:你不需要知道最後一個點在哪裏;你只需要正確的正則表達式:'filename.split(「\\。(?= [^。] * $)」)'。這使用*向前*來斷言匹配點後面的輸入中沒有任何點。 – Bohemian 2017-06-12 15:10:45

28

這是因爲.是正則表達式中的保留字符,表示任何字符。 相反,我們應該用以下語句:

String extensionRemoved = filename.split("\\.")[0]; 
14

我相信你應該逃脫點。請嘗試:

String filename = "D:/some folder/001.docx"; 
String extensionRemoved = filename.split("\\.")[0]; 

否則,dot被解釋爲正則表達式中的任何字符。

42

「。」是java中的一個特殊字符,所以你必須使用「\\」。逃離這個角色:

final String extensionRemoved = filename.split("\\.")[0]; 

我希望這有助於

+4

它不是Java中的特殊字符。這是Java正則表達式引擎中的一個特殊字符。 – 2016-04-08 12:09:02

+0

我的回答並不是很準確,但我同意你的看法。感謝精度;) – aimhaj 2016-04-08 13:20:27

+0

這是一個值得做的區別。而且,我只是意識到我自己搞砸了一點;它是Java中的一個特殊字符,但這不是它在這裏引起問題的原因。無論如何。 – 2016-04-08 13:21:59