在线工具 在线编程 在线白板 在线工具 在线编程 在线白板

java.lang.String的split()方法问题

有没有人在啊,想请问一下,java.lang.String的split()方法问题
最新回答
时间曼妙

2024-06-29 02:13:38

split 参数是个正则表达式.

如果用 patter+matcher去检查, 实际匹配结果如下

0, 1

2, 3

3, 4

4, 5

6, 7

7, 8

8, 9

9, 10

即命中9次.

但从数字3开始后的命中在spit看来都是无效的, 因为截取出来的内容是"", split方法将剔除尾部非空后的所有空格串(0长度). 这个你可以看split源码(Pattern.class) 第 1024行看到.

        if (limit == 0)
            while (resultSize > 0 && matchList.get(resultSize-1).equals(""))
                resultSize--;
 /// 就在这里, 尾部的0长度字符串都被剔除了. 
       String[] result = new String[resultSize];

因此结果为[, *, , , 3] , 命中5次.

so, 有些场合, 这样去split是不合适的.

正确的split调用, 应该这样:

String[] xx = x.split("[1]",-1); //不限制空命中.

这样出来的 xx 的数组, 就是9个. 如下图:

 

追问
可不可以把源码给我,我做下测试。
追答

附 string.split 和 Pattern, Matcher 测试.

运行结果:

 

Test1: '1*11131111'.split('1') =
0=[]
1=[*]
2=[]
3=[]
4=[3]
Test2: '1*11131111'.split('[1]') =
0=[]
1=[*]
2=[]
3=[]
4=[3]
Test3: '1*11131111'.split('1',-1) =
0=[]
1=[*]
2=[]
3=[]
4=[3]
5=[]
6=[]
7=[]
8=[]
Test4: Matcher: Pattern.compile('[1]').match('1*11131111') =
0=[0,  1] = 1
1=[2,  3] = 1
2=[3,  4] = 1
3=[4,  5] = 1
4=[6,  7] = 1
5=[7,  8] = 1
6=[8,  9] = 1
7=[9, 10] = 1
 

刻骨゛铭Xn╮

2024-06-29 02:43:00

这个空格是 Arrays中toString() 中带的。。

给你看下源码就知道了!

 public static String toString(Object[] a) {
        if (a == null)
            return "null";
        int iMax = a.length - 1;
        if (iMax == -1)
            return "[]";
        StringBuilder b = new StringBuilder();
        b.append('[');
        for (int i = 0; ; i++) {
            b.append(String.valueOf(a[i]));
            if (i == iMax)
                return b.append(']').toString();
            //这个append 逗号后面 带了个空格 所以结果是上面的那样 
            b.append(", ");
        }
    }
追问
你很细心,但我想问第一个逗号前面的空串怎么来的,谢谢。
追答
split()分割出来的啊   由于分割前面没有字符 就是以空字符串填充啊,有字符 就以字符填充啊
追问
*后面的三个1最后怎么成为了结果的形式?
追答
他忘append 中添加 空串啊  但是 b.append(", "); 会带一个空格的啊。 ,+空串+空格 就是那样的结果啊
敷衍丶换来无言的结局ゝ

2024-06-29 02:39:47

会不会是下面设置的遇到1就转换成,啊。我记得i18n国际化有这个功能。。