使用任意数量的逗号和空格拆分字符串

我有一个字符串,我试图变成一个列表,但我得到空条目。

",A,B,C,D, ,,," returns [, A, B, C, D, , , ,] 

我想删除所有“空”逗号:

 [A, B, C, D] 

我尝试着

 current.split(",+\\s?") 

这不会产生我想要的结果。 我应该使用什么正则表达式呢?

您需要两个步骤,但只需一行:

 String[] values = input.replaceAll("^[,\\s]+", "").split("[,\\s]+"); 

replaceAll()的调用将删除前导分隔符。
拆分是在任意数量的分隔符上完成的。

split()的行为意味着忽略尾随空白值,因此在拆分之前不需要修剪尾随分隔符。

这是一个测试:

 public static void main(String[] args) throws Exception { String input = ",A,B,C,D, ,,,"; String[] values = input.replaceAll("^[,\\s]+", "").split("[,\\s]+"); System.out.println(Arrays.toString(values)); } 

输出:

 [A, B, C, D] 

您不仅要在匹配中包含接下来的几个空格,还要将连续的逗号分隔为一个单元:

 (,\s*)+ 
 current.split("(?:,\\s*)+") 

我会在Guava中使用Splitter :

 Splitter.on(',').omitEmptyStrings().trimResults().split(",A,B,C,D, ,,,"); 

因为我发现这比正则表达式更容易阅读。

匹配除逗号和空格之外的任何字符可能是一个更清洁的解决方案:

/[^, ]+/g

 ",A,B,C,D, ,,,".match(/[^, ]+/g) // → ["A", "B", "C", "D"] 

如果你在Javascript中工作,你也可以使用Lodash _.words方法(对于上面的正则表达式来说是赞美的):

https://lodash.com/docs#words

 _.words('fred, barney, & pebbles', /[^, ]+/g); // → ['fred', 'barney', '&', 'pebbles']