【问题标题】:Java string split with "." (dot) [duplicate]Java 字符串用“.”分割(点)[重复]
【发布时间】:2013-01-27 18:52:29
【问题描述】:

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

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

虽然这有效:

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

我使用 Java 7。

【问题讨论】:

  • 不拆分使用正则表达式字符串吗?在这种情况下 ”。”表示任何字符。
  • ...它是一个双反斜杠来分隔。

标签: java regex string split indexoutofboundsexception


【解决方案1】:

如果你想在 literal 点上分割,你需要转义点:

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

【讨论】:

  • 请注意,文件名可以包含多个点。必须使用“。”的最后一个索引。并使用它来查找文件名的子字符串。
  • @saurabheights 问题不是关于正确的正则表达式,而是为什么会有ArrayIndexOutOfBoundsException。也就是说,您是不正确的:您不需要知道最后一个点在哪里;你只需要正确的正则表达式:filename.split("\\.(?=[^.]*$)")。这使用 look ahead 来断言在匹配点之后的输入中没有任何点。
  • @emma 您可以通过问题下方的“删除”链接自行删除它们
【解决方案2】:

点“。”是java正则表达式引擎中的一个特殊字符,所以你必须使用“\\。”转义这个字符:

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

【讨论】:

  • 不是 Java 中的特殊字符。它是 Java 正则表达式引擎中的一个特殊字符。
  • 我的回答不是很准确,但我同意你的看法。感谢您的精确;)
  • 这是一个值得做出的区分。另外,我刚刚意识到我自己有点搞砸了。它是 Java 中的一个特殊字符,但这不是它在这里引起问题的原因。无论如何。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    我相信你应该避开这个点。试试:

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

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

    【讨论】:

      猜你喜欢
      • 2015-01-01
      • 2016-02-14
      • 1970-01-01
      • 2011-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多