首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当提供正则表达式时,String.split()方法在Java中到底是如何工作的?

当提供正则表达式时,String.split()方法在Java中到底是如何工作的?
EN

Stack Overflow用户
提问于 2014-03-08 04:08:24
回答 1查看 14.1K关注 0票数 7

我正在准备OCPJP考试,我遇到了下面的例子:

代码语言:javascript
复制
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);
   }
}

这段代码打印16。我期望的是像no_of_characters + 1这样的东西。有人能解释一下吗,在这种情况下,split()方法实际上是做什么的?我只是不明白..。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-08 04:17:26

它在正则表达式引擎中代表\S非空格字符的每个"\\S"上拆分。

因此,让我们尝试在非空格(\S)上拆分"x x"。因为这个正则表达式可以由一个字符匹配,所以让我们迭代它们来标记拆分的位置(我们将使用管道|来实现)。

  • 是否是'x'非空格?是的,那么让我们将其标记为| x
  • is ' '非空格?不是,所以我们把它保留为
  • is 'x'非空格?是的,所以让我们将其标记为| |

因此,我们需要在开头和结尾拆分字符串,这最初会给出结果数组

代码语言:javascript
复制
["", " ", ""]
   ^    ^ - here we split

但由于删除了尾随的空字符串,因此结果将为

代码语言:javascript
复制
[""," "]     <- result
        ,""] <- removed trailing empty string

所以split返回数组["", " "],它只包含两个元素。

顺便说一句。要关闭删除最后一个空字符串的功能,您需要像split("\\S",-1)一样使用带有负值limit的split(regex,limit)

现在让我们回到您的示例。如果您的数据被拆分到每个

代码语言:javascript
复制
I am preparing for OCPJP
| || ||||||||| ||| |||||

这意味着

代码语言:javascript
复制
 ""|" "|""|" "|""|""|""|""|""|""|""|""|" "|""|""|" "|""|""|""|""|""

所以这表示这个数组

代码语言:javascript
复制
[""," ",""," ","","","","","","","",""," ","",""," ","","","","",""]  

但由于尾随的空字符串被删除(如果它们的存在是由Confusing output from String.split上的"" - more信息引起的)

代码语言:javascript
复制
[""," ",""," ","","","","","","","",""," ","",""," ","","","","",""]  
                                                     ^^ ^^ ^^ ^^ ^^

您将获得结果数组,其中只包含此部分:

代码语言:javascript
复制
[""," ",""," ","","","","","","","",""," ","",""," "]  

恰好是16个元素。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22259733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档