基于@zx81 的回答,因为匹配的想法非常好,我添加了 Java 9results
调用,它返回一个Stream
. 由于 OP 想使用split
,我已经收集到String[]
,也是split
如此。
如果逗号分隔符 ( a, b, "c,d"
) 后面有空格,请小心。然后你需要改变模式。
Jshell 演示
$ jshell
-> String so = "123,test,444,\"don't split, this\",more test,1";
| Added variable so of type String with initial value "123,test,444,"don't split, this",more test,1"
-> Pattern.compile("\"[^\"]*\"|[^,]+").matcher(so).results();
| Expression value is: java.util.stream.ReferencePipeline$Head@2038ae61
| assigned to temporary variable $68 of type java.util.stream.Stream<MatchResult>
-> $68.map(MatchResult::group).toArray(String[]::new);
| Expression value is: [Ljava.lang.String;@6b09bb57
| assigned to temporary variable $69 of type String[]
-> Arrays.stream($69).forEach(System.out::println);
123
test
444
"don't split, this"
more test
1
代码
String so = "123,test,444,\"don't split, this\",more test,1";
Pattern.compile("\"[^\"]*\"|[^,]+")
.matcher(so)
.results()
.map(MatchResult::group)
.toArray(String[]::new);
解释
- 正则表达式
[^"]
匹配:引用,除引用之外的任何内容,引用。
- 正则表达式
[^"]*
匹配:引用,除了引用 0(或更多)次之外的任何内容,引用。
- 该正则表达式需要首先“获胜”,否则匹配除逗号 1 次或多次以外的任何内容- 即:
[^,]+
- 将“获胜”。
results()
需要 Java 9 或更高版本。
- 它返回
Stream<MatchResult>
,我使用group()
call 和 collect 将其映射到字符串数组。无参数toArray()
调用将返回Object[]
。