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

10

我有一个字符串,我试图将其转换为列表,但是得到了空条目。

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

我想移除所有的“空”逗号:

[A, B, C, D]

我正在努力。

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

哪个正则表达式可以代替我当前使用的正则表达式,因为它无法产生我想要的结果?


你使用的是哪种编程语言? - Bergi
@Bergi 它是Java语言。这是否重要?我只是在请求正则表达式方面的帮助。 - Aboutblank
3
是的,因为不同的语言使用不同的正则表达式引擎,具有不同的功能和语法。 - Bergi
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]

3
您不仅希望将下面几个空格包含在匹配中,还希望连续的逗号作为一个单元进行拆分:
(,\s*)+

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

2
我会使用Guava中的Splitter来处理此问题:Splitter in Guava
Splitter.on(',').omitEmptyStrings().trimResults().split(",A,B,C,D, ,,,");

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


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']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接