在Java中使用非空白字符时,split方法是如何工作的?

在Java中使用非空白字符时,split方法是如何工作的?,java,arrays,regex,split,Java,Arrays,Regex,Split,我不明白String类中的split()方法在使用regex(非空白字符)时是如何工作的。我在网上找到了一些不完全正确的答案,但我还是不明白。这是我的密码: public class Test { public static void main(String[] args) { String myX = "x xx "; String[] x = myX.split("\\S"); for (String s : x){

我不明白String类中的
split()
方法在使用
regex
(非空白字符)时是如何工作的。我在网上找到了一些不完全正确的答案,但我还是不明白。这是我的密码:

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'
是非空白吗?是的,所以在数组中应该有
“”

最后一个
'
是否为非空白?不,所以在数组中应该有
“”

在我看来,数组应该是这样的:
[“”、“”、“”、“”、“”、“”]

为什么数组看起来像
[“”,“”,“”,“”,“”]
并且长度是4而不是5?在中间位于2X,不仅是数组中出现的一个。


谢谢

以下是一种直观的方法,可以解释
split()
方法如何应用分隔符:

^x xx $
[    ""    |   " "   |    ""    |   " "   ]
^  nothing ^  space  ^ nothing  ^  space  ^
start    1st x      2nd x      3rd x      end of string
这将导致您观察到的阵列输出:

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

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

  • 当它找到第一个
    x
    时,提取的值是
    ,因为前面的分隔符实际上是
    字符串的开头
  • 当它找到第二个
    x
    时,提取的值是
    ,因为前面的分隔符是第一个
    x
    ,而
    是介于两者之间的
  • 当它找到第三个
    x
    时,提取的值是
    ,因为前面的分隔符也是前面的字符,所以没有要提取的内容
  • 当它找到
    字符串
    的结尾时,提取的值是
    “”
    ,因为前面的分隔符是第三个
    x
    ,中间有一个空格

  • 所以结果确实是

    你的逻辑是这样的

    检查每个字符(如果是非空白字符),使其为空,否则放置相同的字符

    String myX=“x xx”;
    字符串[]x=新字符串[myX.length()];
    char[]charArray=myX.toCharArray();
    for(int i=0;i
    给定代码的工作方式如下所示

  • 第一个非空白字符是它将给出的第一个
    x
    剩下的一切:-

  • 第二个非空白字符是它将给出的第二个
    x
    第一个和第二个x之间的所有内容:-
    “”

  • 第三个非空白字符是它将给出的第三个
    x
    第二个和第三个x之间的所有内容:-
    “”

  • 没有非空白字符,因此它使一切都正确 第三个
    x
    作为最后一个元素


  • 所以结果是
    [“”,“”,“”,“”,“”]

    结果元素不是简单的
    0x1 x2x3
    ?为什么
    xx
    会产生两个空字符串?你能说得更具体一点吗?将匹配项混合到数组中:
    [“”、“x”、“x”、“x”、“x”]
    也就是说,
    “xx”
    在左侧有一个空格,在
    x
    s之间有一个空字符串,在右侧有一个空格。在您的逻辑中,您说它将生成两个连续的空字符串,但第二个字符串从何而来?该字符串中有3个非空白字符;它最多可以分成4个部分。但它是空白或非空白这一事实是不相关的-尝试交换
    x
    左右,并使用
    “\\s”
    作为分隔符-您将在输出中看到完全相同的模式。@AlexM。请注意,这与正则表达式或空格几乎没有(或根本没有)关系。如果按文本
    x
    拆分,则得到相同的结果。
        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