Java字符串拆分为"." (点)

Ali*_*lov 341 java regex string split indexoutofboundsexception

为什么Java中这段代码的第二行会抛出ArrayIndexOutOfBoundsException

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

虽然以下工作:

String driveLetter = filename.split("/")[0];
Run Code Online (Sandbox Code Playgroud)

我使用Java 7.

Boh*_*ian 690

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

String extensionRemoved = filename.split("\\.")[0];
Run Code Online (Sandbox Code Playgroud)

否则你正在拆分正则表达式.,这意味着"任何字符".
注意在正则表达式中创建单个反斜杠所需的双反斜杠.


你得到的是ArrayIndexOutOfBoundsException因为你的输入字符串只是一个点,也就是说".",这是一个在点上分割时产生空数组的边缘情况; split(regex)从结果中删除所有尾随空白,但由于在点上分割点只留下两个空格,在删除尾随空格后,您将留下一个空数组.

为了避免获得ArrayIndexOutOfBoundsException这种边缘情况,请使用重载版本split(regex, limit),该版本具有第二个参数,该参数是结果数组的大小限制.如果limit负数,则禁用从结果数组中删除尾随空白的行为:

".".split("\\.", -1) // returns an array of two blanks, ie ["", ""]
Run Code Online (Sandbox Code Playgroud)

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

  • @saurabheights问题不是关于正确的正则表达式,而是关于为什么有一个“ ArrayIndexOutOfBoundsException”。就是说,您不正确:您不需要知道最后一个点在哪里;您只需要正确的正则表达式:`filename.split(“ \\。(?= [^。] * $)”)`。这使用“向前看”来断言输入中匹配点之后没有任何点。 (2认同)

aim*_*haj 97

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

final String extensionRemoved = filename.split("\\.")[0];
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助

  • 它不是Java中的特殊字符.它是Java正则表达式引擎中的一个特殊字符. (23认同)

Gab*_*tti 33

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

String extensionRemoved = filename.split("\\.")[0];
Run Code Online (Sandbox Code Playgroud)


izo*_*ica 19

我相信你应该逃脱这一点.尝试:

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

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

  • 更干净的解决方案:str.split(Pattern.quote("."))[0] (2认同)