爲什麼Java代碼中的第二行會拋出ArrayIndexOutOfBoundsException
?Java字符串以「。」分隔(dot)
String filename = "D:/some folder/001.docx";
String extensionRemoved = filename.split(".")[0];
儘管下面的工作:
String driveLetter = filename.split("/")[0];
我用Java 7
爲什麼Java代碼中的第二行會拋出ArrayIndexOutOfBoundsException
?Java字符串以「。」分隔(dot)
String filename = "D:/some folder/001.docx";
String extensionRemoved = filename.split(".")[0];
儘管下面的工作:
String driveLetter = filename.split("/")[0];
我用Java 7
你需要躲避點,如果你想拆就一個文字點:
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
。
請注意,文件名可以包含多個點。必須使用「。」的最後一個索引。並使用它來查找文件名的子字符串。 – saurabheights 2017-06-12 14:24:07
@saurabheights問題不是關於正確的正則表達式,而是爲什麼有一個'ArrayIndexOutOfBoundsException'。也就是說,你是不正確的:你不需要知道最後一個點在哪裏;你只需要正確的正則表達式:'filename.split(「\\。(?= [^。] * $)」)'。這使用*向前*來斷言匹配點後面的輸入中沒有任何點。 – Bohemian 2017-06-12 15:10:45
這是因爲.
是正則表達式中的保留字符,表示任何字符。 相反,我們應該用以下語句:
String extensionRemoved = filename.split("\\.")[0];
我相信你應該逃脫點。請嘗試:
String filename = "D:/some folder/001.docx";
String extensionRemoved = filename.split("\\.")[0];
否則,dot被解釋爲正則表達式中的任何字符。
「。」是java中的一個特殊字符,所以你必須使用「\\」。逃離這個角色:
final String extensionRemoved = filename.split("\\.")[0];
我希望這有助於
它不是Java中的特殊字符。這是Java正則表達式引擎中的一個特殊字符。 – 2016-04-08 12:09:02
我的回答並不是很準確,但我同意你的看法。感謝精度;) – aimhaj 2016-04-08 13:20:27
這是一個值得做的區別。而且,我只是意識到我自己搞砸了一點;它是Java中的一個特殊字符,但這不是它在這裏引起問題的原因。無論如何。 – 2016-04-08 13:21:59
不分裂使用正則表達式字符串?在這種情況下 」。」意味着任何角色。 – Snps 2013-02-12 12:53:46
...這是一個DOUBLE反斜線來分隔。 – Ben 2013-12-06 05:41:29