Java 字符串拆分为 “.”(点)

为什么此代码的第二行会抛出 ?ArrayIndexOutOfBoundsException

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

虽然这有效:

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

我使用Java 7。


答案 1

如果要在文字点上拆分,则需要转义该点:

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

否则,您将在 正则表达式 上拆分,这意味着“任何字符”。
请注意在正则表达式中创建单个反斜杠所需的双反斜杠。.


你得到一个,因为你的输入字符串只是一个点,即 ,这是一个边缘情况,当在点上拆分时会产生一个空数组;split(正则表达式)从结果中删除所有尾随空格,但是由于在点上拆分一个点只留下两个空白,因此在删除尾随空格后,您将留下一个空数组。ArrayIndexOutOfBoundsException"."

为了避免获得此边缘情况,请使用 split(regex, limit) 的重载版本,它具有第二个参数,即结果数组的大小限制。当 为负值时,将从生成的数组中删除尾随空格的行为被禁用:ArrayIndexOutOfBoundsExceptionlimit

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

即,当只是一个点时,调用将返回空白,但调用将抛出一个.filename"."filename.split("\\.", -1)[0]filename.split("\\.")[0]ArrayIndexOutOfBoundsException


答案 2

点 “.” 是 java 正则表达式引擎中的特殊字符,因此您必须使用 “\\.” 来转义以下字符:

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