Java String split regexp返回带有多个分隔符的空字符串

时间:2015-05-04 20:32:11

标签: java regex string

我有一个问题,我似乎无法在这里找到答案,所以我要问它。

问题是我有一个字符串,我有分隔符。我想从这些分隔符之间的东西(可能是单词,数字等)创建一个字符串数组。但是,如果我有两个彼此相邻的分隔符,split方法将为其中一个实例返回一个空字符串。

我对更连续的分隔符进行了测试。我发现如果我有n个分隔符,我将在结果数组中有n-1个空字符串。换句话说,如果我同时拥有","和" "作为分隔符和句子" 这是一个非常美好的一天,不是",那么带有结果的数组就像:

{... , "day", "", "isn't" ...}

我希望得到那些额外的空字符串,但我无法弄清楚如何做到这一点。我有分隔符的示例正则表达式是:

"[\\s,.-\\'\\[\\]\\(\\)]"

还能解释为什么结果数组中有额外的空字符串吗?

P.S。我读了一些类似的帖子,其中包括有关正则表达式第二个参数的信息。我尝试了负数,零数和正数,但我没有得到我正在寻找的结果。 (其中一个问题有一个答案说-1作为参数可以解决问题,但它没有。

4 个答案:

答案 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-Z0-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