【问题标题】:String.split's weird behaviour dealing with spaces and tabsString.split 处理空格和制表符的奇怪行为
【发布时间】:2013-01-30 23:22:18
【问题描述】:

我有一个由制表符和空格以及一些任意字符组成的字符串。下面的字符串由space space tab tab 1 space tab -2 tab space + space 组成。

import java.util.Arrays;

String[] s = "          1   -2   + ".split("[\\s]+");
System.out.println(Arrays.toString(s));

使用正则表达式[\s+] 运行拆分会得到[1, -2, +],但是我在我的机器(OS X,JDK1.6.0_37)上得到的返回数组是[, 1, -2, +]

原来第一个元素只是“空白”(s[0].equals("") 返回true),所以它应该与\s 匹配。

我错过了什么?

【问题讨论】:

  • 这对我来说很有意义——想象一下,如果你有一个第一行是“,foo,bar”的 CSV 文件——那自然不会暗示有三列,第一个值为空吗?
  • 不需要字符类,\s+ 也能正常工作

标签: java regex string


【解决方案1】:

如果在拆分字符串时,字符串的第一个字符位于分隔符中,则生成的数组的第一个元素始终是empty string

这样,你的字符串总是以empty string 开头。因此,您的定界符 - \s+ 将分为两部分 " a" 字符串(注意前导空格),第一部分在 \s+ 之前,即 空字符串 "",然后在它之后,这是a

所以,你得到的输出是显而易见的。

原来第一个元素只是“空白”(s[0].equals("") 返回 true),所以它应该已经被 \s 匹配了。

不,不应该。空格不是空字符串。它们之间是有区别的。

【讨论】:

  • 对,在“,2,3,4”之类的数据上用“,”分割是有道理的,显然第一个字段是空的。
  • @Smit。哈哈。不;)我是吸血鬼。 :D
  • 谢谢,我想这是有道理的。有什么聪明的方法可以重写它,以便不包含第一个空字符? IE。我只想要[1, -2, +]
  • @0sh.. 您可以先修剪字符串,然后应用拆分。这将从头开始删除分隔符,因此不会在数组中为您提供空元素。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多