Java字符串用“.”分割(点)

新手上路,请多包涵

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

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

虽然这有效:

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

我使用 Java 7。

原文由 Ali Ismayilov 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 427
2 个回答

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

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

否则,您将在正则表达式 . 上拆分,这意味着“任何字符”。

请注意在正则表达式中创建单个反斜杠所需的双反斜杠。


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

为避免在这种极端情况下得到 ArrayIndexOutOfBoundsException ,请使用 split(regex, limit) 的重载版本,它的第二个参数是结果数组的大小限制。当 limit 时,从结果数组中删除尾随空白的行为被禁用:

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

ie, when filename is just a dot "." , calling filename.split("\\.", -1)[0] will return a blank, but calling filename.split("\\.")[0] will throw an ArrayIndexOutOfBoundsException

原文由 Bohemian 发布,翻译遵循 CC BY-SA 3.0 许可协议

点“.”是java正则引擎中的一个特殊字符,所以你必须使用“\.”逃避这个角色:

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

原文由 aimhaj 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题