10

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

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

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

[A, B, C, D]

我正在努力

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

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

4

4 回答 4

15

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

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]
于 2013-03-07T20:54:23.907 回答
3

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

(,\s*)+
current.split("(?:,\\s*)+")
于 2013-03-07T20:27:17.097 回答
2

为此,我会在 Guava中使用 Splitter:

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

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

于 2013-03-07T20:31:08.930 回答
0

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

/[^, ]+/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']
于 2015-10-29T15:44:57.010 回答