Java String split()的意外行为
我试图使用String split函数拆分字符串,这是一个例子:
String[] list = " Hello ".split("\\s+"); System.out.println("String length: " + list.length); for (String s : list) { System.out.println("----"); System.out.println(s); }
这是输出:
String length: 2 ---- ---- Hello
如您所见,前导空格在String数组中变为空元素,但尾随空格不是。
有谁知道为什么?
您需要使用另一个指定限制的split方法并指定限制为-1
String[] list = " Hello ".split("\\s+", -1);
保留尾随空格, – 默认行为是根据javadoc省略尾随空格
编辑( 回答评论 ):
要修剪前导空格,可以在拆分String
之前剥离前导空格
String str = " Hello ".replaceAll("^\\s+", ""); String[] list = str.split("\\s+", -1);
从拆分文档
此方法的作用就像通过调用给定表达式和limit参数为零的双参数split方法一样 。 因此,结尾的空字符串不包含在结果数组中。
所以实际上split(regex)
与使用相同
split(regex, 0);
它的文件说
limit参数控制模式的应用次数,因此会影响结果数组的长度。 如果限制n大于零,那么模式将最多应用n – 1次,数组的长度将不大于n ,并且数组的最后一个条目将包含超出最后一个匹配分隔符的所有输入。 如果n是非正数,那么模式将被应用尽可能多的次数,并且数组可以具有任何长度。 如果n为零,那么模式将被应用尽可能多的次数,该数组可以具有任何长度,并且将丢弃尾随的空字符串。
所以如果你想要包含尾随空字符串,就必须使用非零值
split("\\s+",10);
但这也会将结果数组限制为最多10个元素。 要摆脱这个问题,请使用一些负数
split("\\s+",-1);
- m2e:使用exec-maven-plugin生成代码
- 用于AWT / Swing的Java JDK 1.7中的Apple Retina显示支持
- 我可以在端口443上安全地运行Tomcat,在8080上安全地运行Tomcat
- VisualVM无法取样内存
- 为什么Hibernate默认设置动态insert = false
- 使用Java和Scribe的Vimeo搜索API
- 如何在RESTEasy 3.0客户端框架中设置HTTP标头(使用ResteasyClientBuilder和ResteasyWebTarget)?
- 没有为响应类型找到合适的HttpMessageConverter
- 将默认浏览器作为String返回的方法?