以点作为分隔符拆分字符串

新手上路,请多包涵

我想知道我是否打算以正确的方式拆分 . 上的字符串?我的代码是:

 String[] fn = filename.split(".");
return fn[0];

我只需要字符串的第一部分,这就是我返回第一项的原因。我问是因为我在 API 中注意到 . 表示任何字符,所以现在我被卡住了。

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

阅读 421
2 个回答

split() 接受正则表达式,因此您需要转义 . 不将其视为正则表达式元字符。这是一个例子:

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

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

我在这里只看到解决方案,但没有对问题的完整解释,所以我决定发布这个答案

问题

您需要了解一些关于 text.split(delim) 的事情。 split 方法:

  1. 接受作为参数的 正则表达式(regex),它描述了我们要分割的分隔符,
  2. if delim exists at end of text like in a,b,c,, (where delimiter is , ) split at first will创建类似 ["a" "b" "c" "" ""] 的数组,但由于在大多数情况下我们并不真正需要这些尾随的空字符串,它也会自动为我们删除它们。因此它创建了 _另一个没有这些尾随空字符串的数组并将其返回_。

您还需要知道 .正则表达式 中的 特殊字符。它代表 任何字符(行分隔符除外,但可以使用 Pattern.DOTALL 标志更改)。

因此,对于像 "abc" 这样的字符串,如果我们拆分 "." split 方法将

  1. 创建像 ["" "" "" ""] 这样的数组,
  2. 但由于此数组仅包含空字符串,并且它们都在尾部,因此它们将被删除(如前第二点所示)

这意味着我们将得到空数组 [] (没有元素,甚至没有空字符串),所以我们不能使用 fn[0] 因为没有索引 0。

解决方案

要解决此问题,您只需创建代表点的正则表达式。为此,我们需要转义 . 。有几种方法可以做到这一点,但最简单的可能是使用 \ (在 String 中需要写成 "\\" 因为 \ 在那里也很特别需要另一个 \ 进行转义)。

所以你的问题的解决方案可能看起来像

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

奖金

您还可以使用其他方式来转义该点,例如

  • 使用字符类 split("[.]")
  • 引号 包装它 split("\\Q.\\E")
  • 使用带有 Pattern.LITERAL 标志的正确模式实例
  • 或者简单地使用 split(Pattern.quote(".")) 并让正则表达式为你转义。

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

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