2016-11-24 63 views
2

我不明白当使用regex(非空白字符)时,String类的split()方法是如何工作的。我在互联网上发现了一些局部的an but,但我仍然不明白。这里是我的代码:在Java中使用非空白字符时,split方法如何工作?

public class Test { 
    public static void main(String[] args) { 
     String myX = "x xx "; 
     String[] x = myX.split("\\S"); 

     for (String s : x){ 
      System.out.print("\"" + s + "\", "); 
     } 
     System.out.println(x.length); 
    } 
} 

我的逻辑如下:

是第一'x'非空白?是的,所以在阵列中我们应该有""
' '非空白?不,所以在阵列中我们应该有" "
是第二个'x'非空白?是的,所以在阵列中我们应该有""
第三个'x'是否为非空白?是的,所以在阵列中我们应该有""
是否最后' '非空白?没有,所以在阵列中,我们应该有" "

在我看来阵列应该是这样的:["", " ", "", "", " "]

为什么阵列看起来像["", " ", "", " "]并具有5代替4的长度?在中间位于2倍,不仅出现在阵列中的一个。

谢谢!

+0

生成的元素不是简单的'0x1 x2x3'?为什么'xx'会导致*两个*空字符串? – Biffen

+0

你能更具体吗? –

+0

将匹配到数组中:'[“”,“x”,“”,“x”,“”,“x”,“”]''ie,'“xx”'在左边有一个空格,空字符串在'x's和右边的空格之间。在你的逻辑中,你会说它会产生两个连续的空字符串,但第二个字符串从哪里来呢? – Biffen

回答

1

,你倒是应该问自己的问题我们在两个连续的分隔符之间有什么?

  1. 当它发现第一x,所提取的值是"",因为以前的分离器是的String
  2. 几乎一开始当它发现第二x,所提取的值是" "因为以前的分离器是第一x" "是我们
  3. 之间有当它发现第三x,提取的值是""因为之前的分离器也是一个字符所以没有什么可提取
  4. 当它找到String的结尾时,提取的值是" ",因为之前的分隔符是第三个x,我们之间有一个空格。

所以结果确实"", " ", "", " "

+1

终于明白了,非常感谢! –

2

这里是解释的视觉方式split()方法如何应用的分隔符:

^x xx $ 
[ "" | " " | "" | " " ] 
^ nothing^space^nothing^space^
start 1st x  2nd x  3rd x  end of string 

这将导致你所观察到的阵列输出:

["", " ", "", " "] 
1

嗯,有点晚了,但希望把它。

你的逻辑告诉是通过每个人物像这样

去,如果它是一个非空白字符让它空白,否则把相同的字符。

String myX = "x xx "; 
    String[] x = new String[myX.length()]; 
    char[] charArray = myX.toCharArray(); 
    for (int i = 0; i < charArray.length; i++) { 
     char c = charArray[i]; 
     x[i] = !Character.isWhitespace(c) ? "" : String.valueOf(c); 
    } 
    for (String s : x){ 
     System.out.print("\"" + s + "\", "); 
    } 
    System.out.print(x.length); // prints "", " ", "", "", " ", 5 

你定的代码会像下面

  1. 的第一个非空格字符是第一x它会给 一切留给它: - ""

  2. 第二个非空白字符是第二个x它会给 一切第一和第二个X之间: - " "

  3. 第三个非空白字符是第三x它会给第二和第三X之间 一切: - ""

  4. 没有非空白字符,以便它将 设为第三个x作为最后一个元素。

所以结果是["", " ", "", " "]

+0

好的观点。谢谢! –

相关问题