为什么 space 在此拆分指令中显示为子字符串?

Why the space appears as sub string in this split instruction?

我有带空格的字符串和一些需要排除的非信息字符和子字符串,只是为了保留一些重要部分。我使用了如下拆分:

String myString[]={"01: Hi       you look tired today?  Can I help you?"};
myString=myString[0].split("[\s+]");// Split based on any white spaces
for(int ii=0;ii<myString.length;ii++) 
    System.out.println(myString[ii]);

结果是:

01:
Hi






you
look
tired
today?

Can
I
help
you?

正则表达式为“[\s+]”时,拆分后的空格作为子字符串出现,而当正则表达式为“\s+”时,空格消失。我很困惑,无法在相关的堆栈溢出页面中找到答案。 link regex-Pattern 让我更加困惑了。 请帮忙,我是 java.

的新手
19/1/2015:Edit

在您提出宝贵意见后,我在我的程序中指出了需要分解和处理条件语句的地方。我的案例是:

String s1="01:IF   rd.h && dq.L && o.LL && v.L THEN la.VHB , av.VHR with 0.4610;";
String [] s2=s1.split(("[\s\&\,]+"));
for(int ii=0;ii<s2.length;ii++)System.out.println(s2[ii]);

到现在结果还不错:

01:IF
rd.h
dq.L
o.LL
v.L
THEN
la.VHB
av.VHR
with
0.4610;

我的下一步是将字符串 "with" 添加到正则表达式中,并在拆分时去掉这个词。 我这样试过:

String s1="01:IF   rd.h && dq.L && o.LL && v.L THEN la.VHB , av.VHR with 0.4610;";
String [] s2=s1.split(("[\s\&\, with]+"));
for(int ii=0;ii<s2.length;ii++)System.out.println(s2[ii]);

结果并不完美,因为我在每个 "h" 字母处都得到了意外的额外拆分:

01:IF
rd.
dq.L
o.LL
v.L
THEN
la.VHB  
av.VHR
0.4610;

关于如何指定带有混合空格和分隔符的字符串有什么建议吗? 非常感谢。

在方括号内,[\s+]表示空白字符class加上加号。它只有一个字符,因此如 Todd 所述,一系列空格将拆分许多空字符串,并且还将使用 + 作为分隔符。

您应该使用 \s+(不带括号)作为分隔符。这意味着一个或多个空白字符。

myString=myString[0].split("\s+");

您最大的问题是对正则表达式的了解不够,无法正确编写它们。您不理解的一个关键点是 [...] 是一个 字符 class,这是一个字符列表,其中任何一个都可以匹配。例如:

  • [abc] 匹配 a、b 或 c(不匹配 "abc")
  • [\s+] 匹配任何空格或“+”字符
  • [with] 匹配单个字符 w、i、t 或 h
  • [.$&^?] 匹配那些文字字符 - 大多数字符在字符 class
  • 中时会失去其特殊的正则表达式含义

要拆分任意数量的空格、逗号和符号并使用 "with"(如果出现),请执行以下操作:

String [] s2 = s1.split("[\s,&]+(with[\s,&]+)?");

您可以在此处轻松试用 Online Regex 并获得有用的评论。