为什么 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 并获得有用的评论。
我有带空格的字符串和一些需要排除的非信息字符和子字符串,只是为了保留一些重要部分。我使用了如下拆分:
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 并获得有用的评论。