string.split(“\\ S”)如何工作

时间:2014-10-09 14:21:23

标签: java regex ocpjp

我在Ganesh和Sharma的书中提出了一个问题oracle_certified_professional_java_se_7_programmer_exams_1z0-804_and_1z0-805。

一个问题是:

  
      
  1. 考虑以下程序并预测输出:

      class Test {
    
        public static void main(String args[]) {
          String test = "I am preparing for OCPJP";
          String[] tokens = test.split("\\S");
          System.out.println(tokens.length);
        }
      }
    
         

    a)0

         

    b)5

         

    c)12

         

    d)16

  2.   

现在我明白\ S是正则表达式意味着将非空格字符视为分隔符。 但我对于正则表达式如何匹配以及它是什么感到困惑 分裂产生的实际代币。

我添加了代码以打印出令牌,如下所示

for (String str: tokens){
  System.out.println("<" + str + ">");
}

我得到了以下输出

16

<>

< >

<>

< >

<>

<>

<>

<>

<>

<>

<>

<>

< >

<>

<>

< >

所以很多空字符串令牌。 我只是不明白这一点。

我会一直认为,如果分隔符是非空格字符,那么在上面的文本中,所有字母字符都可以作为分隔符,所以如果匹配则可能有21个令牌 也会导致空字符串的标记。我只是不明白Java的正则表达式引擎是如何解决这个问题的。那里有哪些正则表达式大师可以为我揭示这段代码吗?

3 个答案:

答案 0 :(得分:12)

从API documentation复制:(粗体是我的)

public String[] split(String regex)
     

围绕给定正则表达式的匹配拆分此字符串。   此方法的工作方式就像通过调用双参数split方法一样   给定的表达式和一个零的限制参数。 尾随空   因此,字符串不包含在结果数组中。

     

例如,字符串“boo:and:foo”会产生以下结果   用这些表达式:

 Regex  Result
   :    { "boo", "and", "foo" }
   o    { "b", "", ":and:f" }

检查第二个例子,其中最后2个“o”被删除:你的问题的答案是"OCPJP" substring被视为一个分隔符的集合,非空字符串不遵循,所以那个部分修剪过。

答案 1 :(得分:6)

结果为16而不是21的原因是javadoc for Split

  

因此,结果中不包括尾随空字符串   阵列。

这意味着,例如,如果你说

"/abc//def/ghi///".split("/")

结果将有五个元素。第一个是"",因为它不是一个尾随的空字符串;其他人将是"abc""""def""ghi"。但剩下的空字符串将从数组中删除。

在张贴的案例中:

"I am preparing for OCPJP".split("\\S")

这是一回事。由于非空格字符是分隔符,因此每个字母都是分隔符,但是 OCPJP字母本质上不计数,因为这些分隔符会导致尾随空字符串,然后丢弃。因此,由于"I am preparing for"中有15个字母,因此它们被视为划分16个子字符串(第一个是"",最后一个是" ")。

答案 2 :(得分:5)

首先,以\s(小写)开头,这是白色空间的正则表达式字符类,即空格&#39; &#39;标签&#39; \ t&#39;,新行字符&#39; \ n&#39;和&#39; \ r&#39;,垂直标签&#39; \ v&#39;和一堆其他人物。

\S(大写)与此相反,因此这意味着任何非空白字符。

所以当你拆分这个String&#34; I am preparing for OCPJP&#34;使用\S,您可以在每个字母处有效地分割字符串。令牌数组长度为16的原因。

现在为什么这些都是空的。

考虑以下字符串:Hello,World,如果我们使用,拆分它,我们最终会得到一个长度为2的String数组,其中包含以下内容:HelloWorld。请注意,,不在任何一个字符串中,它已被删除。

I am preparing for OCPJP字符串发生同样的事情,它已被拆分,正则表达式匹配的点不在任何返回值中。并且因为该String中的大多数字母后跟另一个字母,所以最终会加载长度为零的字符串,只保留空白字符。