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

时间:2015-01-17 23:35:49

标签: java regex string

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

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 +”时,空格消失。我很困惑,无法在相关的堆栈溢出页面中找到答案。链接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;

有关如何使用混合空格和分隔标记指定字符串的任何建议吗? 非常感谢。

2 个答案:

答案 0 :(得分:2)

在方括号内,[\s+]将表示添加了加号的空白字符类。它只有一个字符,所以一系列空格会像Todd所说的那样分割许多空字符串,并且还会使用+作为分隔符。

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

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

答案 1 :(得分:0)

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

  • [abc]匹配a,b或c(不匹配&#34; abc&#34;)
  • [\\s+]匹配任何空格或&#34; +&#34;字符
  • [with]匹配w,i,t或h
  • 的单个字符
  • [.$&^?]匹配那些文字字符 - 大多数字符在字符类中失去特殊的正则表达式意义

分割任意数量的空格,逗号和&符号,并使用&#34;&#34; (如果出现),请执行以下操作:

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

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