Java字符串用“。”分隔。(点)

java regex string split indexoutofboundsexception

379689 观看

4回复

2137 作者的声誉

这个问题已经在这里有了答案:

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

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

尽管这可行:

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

我使用Java 7。

作者: Ali Ismayilov 的来源 发布者: 2013 年 2 月 12 日

回应 4


668

312463 作者的声誉

如果要分割为文字点,则需要对点进行转义:

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

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


之所以得到一个是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

作者: Bohemian 发布者: 2013 年 2 月 12 日

32

117600 作者的声誉

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

String extensionRemoved = filename.split("\\.")[0];
作者: Gabriele Mariotti 发布者: 2013 年 2 月 12 日

18

58053 作者的声誉

我相信你应该逃脱这个点。尝试:

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

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

作者: Ivaylo Strandjev 发布者: 2013 年 2 月 12 日

91

1072 作者的声誉

“” 是Java正则表达式引擎中的特殊字符,因此您必须使用“ \\”。逃脱此字符:

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

我希望这有帮助

作者: aimhaj 发布者: 2013 年 2 月 12 日
32x32