用split()分隔字符串,得到的字符串数组第一个为什么是空白的

时间:2021-07-19 21:44:25

import java.util.*;
public class RegexTest {
public static void main(String[] args) {
String str = "son cat java moon hahaha mmmm";
    String[] dataArr = str.split(".on\\s*");
    System.out.println(dataArr.length);
  for (int i = 0; i < dataArr.length; i++) {
   System.out.println(dataArr[i]);
  }
}
}

代码如上,打印出来的效果如下:

cat java m
hahaha mmmm

为什么第一行是空白的呢?

12 个解决方案

#1


你用一个字符和on分割,结果有空格,这么了?

#2


因为son和你的正则匹配上了啊,
son前面算一个子串了。

#3


引用 2 楼 magong 的回复:
因为son和你的正则匹配上了啊,
son前面算一个子串了。


马工这个月抢分好疯狂啊。。我等低调路过

#4


这样不好,大家一起上,把Java炒起来。

#5


哈哈,炒java

#6


引用 2 楼 magong 的回复:
因为son和你的正则匹配上了啊,
son前面算一个子串了。

son前面怎么算一个子串?"s"是这个字符串的第一个字符啊。
正在学习java,所以很多不太懂,谢谢

#7


引用楼主 yapai 的回复:
Java code


import java.util.*;
public class RegexTest {
    public static void main(String[] args) {
        String str = "son cat java moon hahaha mmmm";
    String[] dataArr = str.split(".on……

split方法分割的时候空白也算
比如
String s = "a,b";
那么 String[] sa = s.split(","); //不管a或b是不是空白,都会分割
不过如果a是空白,分割的数组前一个是空白,但是b是空白,就不存在第二个元素,这个要注意

#8


split的时候,相邻的分割符之间、分割符与左边起始位置或右边终点位置之间都算有空白字符串被分隔了
这就是split执行的机制

#9


引用 7 楼 qybao 的回复:
引用楼主 yapai 的回复:
Java code


import java.util.*;
public class RegexTest {
public static void main(String[] args) {
String str = "son cat java moon hahaha mmmm";
String[] dataArr = str.split(".……


不是很明白你的说法。。可以再讲讲吗?

#10


引用 9 楼 yapai 的回复:
不是很明白你的说法。。可以再讲讲吗?


String s = "a,b";
如果a是空白,就变成 ",b", 如果b是空白,就变成"a,",如果ab都是空白就变成","
不管什么情况,以","分割为例,因为分隔符存在,所以都会以分隔符为界把s分割,所以首先可以初步估计得到一个数组有2个元素,只是元素是不是空白而已,然而有个特殊情况,就是b是空白的时候,分割时只有获得分隔符前半部的信息,后半部被忽略,即当b为空白的时候,得到的数组只有一个元素a,b被舍弃了,这就是要注意的地方

#11


引用 10 楼 qybao 的回复:
引用 9 楼 yapai 的回复:
不是很明白你的说法。。可以再讲讲吗?


String s = "a,b";
如果a是空白,就变成 ",b", 如果b是空白,就变成"a,",如果ab都是空白就变成","
不管什么情况,以","分割为例,因为分隔符存在,所以都会以分隔符为界把s分割,所以首先可以初步估计得到一个数组有2个元素,只是元素是不是空白而已,然而有个特殊情况,就是b是空白的……

我明白了,谢谢。那我怎样去掉这个空白的子串呢?

#12


我知道了,只有判断长度就好了,谢谢大家的指教

#1


你用一个字符和on分割,结果有空格,这么了?

#2


因为son和你的正则匹配上了啊,
son前面算一个子串了。

#3


引用 2 楼 magong 的回复:
因为son和你的正则匹配上了啊,
son前面算一个子串了。


马工这个月抢分好疯狂啊。。我等低调路过

#4


这样不好,大家一起上,把Java炒起来。

#5


哈哈,炒java

#6


引用 2 楼 magong 的回复:
因为son和你的正则匹配上了啊,
son前面算一个子串了。

son前面怎么算一个子串?"s"是这个字符串的第一个字符啊。
正在学习java,所以很多不太懂,谢谢

#7


引用楼主 yapai 的回复:
Java code


import java.util.*;
public class RegexTest {
    public static void main(String[] args) {
        String str = "son cat java moon hahaha mmmm";
    String[] dataArr = str.split(".on……

split方法分割的时候空白也算
比如
String s = "a,b";
那么 String[] sa = s.split(","); //不管a或b是不是空白,都会分割
不过如果a是空白,分割的数组前一个是空白,但是b是空白,就不存在第二个元素,这个要注意

#8


split的时候,相邻的分割符之间、分割符与左边起始位置或右边终点位置之间都算有空白字符串被分隔了
这就是split执行的机制

#9


引用 7 楼 qybao 的回复:
引用楼主 yapai 的回复:
Java code


import java.util.*;
public class RegexTest {
public static void main(String[] args) {
String str = "son cat java moon hahaha mmmm";
String[] dataArr = str.split(".……


不是很明白你的说法。。可以再讲讲吗?

#10


引用 9 楼 yapai 的回复:
不是很明白你的说法。。可以再讲讲吗?


String s = "a,b";
如果a是空白,就变成 ",b", 如果b是空白,就变成"a,",如果ab都是空白就变成","
不管什么情况,以","分割为例,因为分隔符存在,所以都会以分隔符为界把s分割,所以首先可以初步估计得到一个数组有2个元素,只是元素是不是空白而已,然而有个特殊情况,就是b是空白的时候,分割时只有获得分隔符前半部的信息,后半部被忽略,即当b为空白的时候,得到的数组只有一个元素a,b被舍弃了,这就是要注意的地方

#11


引用 10 楼 qybao 的回复:
引用 9 楼 yapai 的回复:
不是很明白你的说法。。可以再讲讲吗?


String s = "a,b";
如果a是空白,就变成 ",b", 如果b是空白,就变成"a,",如果ab都是空白就变成","
不管什么情况,以","分割为例,因为分隔符存在,所以都会以分隔符为界把s分割,所以首先可以初步估计得到一个数组有2个元素,只是元素是不是空白而已,然而有个特殊情况,就是b是空白的……

我明白了,谢谢。那我怎样去掉这个空白的子串呢?

#12


我知道了,只有判断长度就好了,谢谢大家的指教