【问题标题】:How does split method work when using a non-whitespace character in Java?在 Java 中使用非空白字符时 split 方法如何工作?
【发布时间】:2016-11-24 11:38:46
【问题描述】:

我不明白 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,不只出现数组中的一个。

谢谢!

【问题讨论】:

  • 生成的元素不就是0x1 x2x3 吗?为什么xx 会产生两个空字符串?
  • 你能说得具体点吗?
  • 将匹配项混合到数组中:[ "", "x", " ", "x", "", "x", " " ] 即," xx " 左边有一个空格,xs 之间有一个空字符串,右边有一个空格。在您的逻辑中,您说它会产生两个连续的空字符串,但是第二个来自哪里?
  • 该字符串中有 3 个非空白字符;它可以分成的大部分是 4。但它是空格还是非空格的事实无关紧要 - 尝试交换 x_,并使用 "\\s" 作为分隔符 - 你会看到输出中的相同模式。
  • @AlexM。请注意,这与正则表达式或空格几乎没有关系(或没有关系)。如果你用文字 x 分割,你会得到相同的结果。

标签: java arrays regex split


【解决方案1】:

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

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

这会导致您观察到的数组输出:

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

【讨论】:

    【解决方案2】:

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

    1. 当它找到第一个x 时,提取的值为"",因为前一个分隔符实际上是String 的开头
    2. 当它找到第二个x时,提取的值为" ",因为前一个分隔符是第一个x,而" "是我们之间的分隔符
    3. 当它找到第三个x时,提取的值为"",因为前一个分隔符也是前一个字符,所以没有什么可提取的
    4. 当它找到String 的结尾时,提取的值为" ",因为前一个分隔符是第三个x,并且我们之间有一个空格。

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

    【讨论】:

      【解决方案3】:

      嗯,有点晚了,但是想说一下。

      你的逻辑是这样的

      遍历每个字符,如果它是非空白字符,则将其留空,否则放置相同的字符。

          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 作为最后一个元素。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-15
        • 2014-03-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-07
        相关资源
        最近更新 更多