我有一个问题,我似乎无法在这里找到答案,所以我要问它。
问题是我有一个字符串,我有分隔符。我想从这些分隔符之间的东西(可能是单词,数字等)创建一个字符串数组。但是,如果我有两个彼此相邻的分隔符,split方法将为其中一个实例返回一个空字符串。
我对更连续的分隔符进行了测试。我发现如果我有n个分隔符,我将在结果数组中有n-1个空字符串。换句话说,如果我同时拥有","和" "作为分隔符和句子" 这是一个非常美好的一天,不是",那么带有结果的数组就像:
{... , "day", "", "isn't" ...}
我希望得到那些额外的空字符串,但我无法弄清楚如何做到这一点。我有分隔符的示例正则表达式是:
"[\\s,.-\\'\\[\\]\\(\\)]"
还能解释为什么结果数组中有额外的空字符串吗?
P.S。我读了一些类似的帖子,其中包括有关正则表达式第二个参数的信息。我尝试了负数,零数和正数,但我没有得到我正在寻找的结果。 (其中一个问题有一个答案说-1作为参数可以解决问题,但它没有。
答案 0 :(得分:1)
您的正则表达式只描述一个字符。如果您希望它一次匹配多个分隔符,请使用量词:
String s = "This is a very nice day, isn't it";
String[] tokens = s.split("[\\s,.\\-\\[\\]()']+");
(请注意表达式末尾的&{39; +
')
答案 1 :(得分:1)
我认为你的问题只是正则表达式本身。你应该使用贪婪的量词:
"[\\s,.-\\'\\[\\]\\(\\)]+"
请参阅http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#sum
X + ... X,一次或多次
答案 2 :(得分:1)
您可以使用此正则表达式进行拆分:
[\\s,.'\\[\\]()-]+
A-Z
或0-9
+
来匹配1个以上的分隔符答案 3 :(得分:0)
如果要删除空字符串,可以使用Guava项目Splitter类。
on
方法:返回使用给定固定字符串作为分隔符的拆分器。
示例(忽略空字符串):
System.out.println(
Splitter.on(',')
.trimResults()
.omitEmptyStrings()
.split("foo,bar,, qux")
);
<强>输出:强>
[foo, bar, qux]
onPattern
方法:返回
splitter
,它考虑与给定匹配的任何子序列 pattern(正则表达式)作为分隔符。
示例(忽略空字符串):
System.out.println(
Splitter
.onPattern("([,.|])")
.trimResults()
.omitEmptyStrings()
.split("foo|bar,, qux.hi")
);
<强>输出:强>
[foo, bar, qux, hi]
有关详情,请参阅Splitter documentation。