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

时间:2013-02-12 12:51:35

标签: java regex string split indexoutofboundsexception

为什么Java中此代码的第二行会引发ArrayIndexOutOfBoundsException

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

虽然下面有效:

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

我使用Java 7。

4 个答案:

答案 0 :(得分:637)

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

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 :(得分:86)

“”。是java中的特殊字符,因此必须使用“\\”。逃避这个角色:

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

我希望这会有所帮助

答案 2 :(得分:31)

这是因为.是正则表达式中的保留字符,表示任何字符。 相反,我们应该使用以下语句:

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

答案 3 :(得分:17)

我相信你应该逃避这一点。尝试:

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

否则dot被解释为正则表达式中的任何字符。