小编典典

用Java中的RegEx解析CSV输入

java

我知道,现在我有两个问题。但是我很开心!

我从这个建议开始,不是尝试拆分,而是匹配一个可接受的字段,然后从那里扩展到这个表达式。

final Pattern pattern = Pattern.compile("\"([^\"]*)\"|(?<=,|^)([^,]*)(?=,|$)");

表达式看起来像这样,没有烦人的转义引号:

"([^"]*)"|(?<=,|^)([^,]*)(?=,|$)

这对我来说效果很好-要么匹配“两个引号以及它们之间的引号”,要么匹配“行首或逗号与行尾或逗号之间的内容”。遍历比赛获得所有字段,即使它们为空。例如,

the quick, "brown, fox jumps", over, "the",,"lazy dog"

分解成

the quick
"brown, fox jumps"
over
"the"

"lazy dog"

大!现在,我想删除引号,因此像在逗号中一样,在非捕获组中添加了先行和后退。

final Pattern pattern = Pattern.compile("(?<=\")([^\"]*)(?=\")|(?<=,|^)([^,]*)(?=,|$)");

表达式再次是:

(?<=")([^"]*)(?=")|(?<=,|^)([^,]*)(?=,|$)

而不是预期的结果

the quick
brown, fox jumps
over
the

lazy dog

现在我得到了这个细分:

the quick
"brown
 fox jumps"
,over,
"the"
,,
"lazy dog"

我想念什么?


阅读 214

收藏
2020-09-09

共1个答案

小编典典

运算符优先级。基本上没有。从左到右。因此,或(|)应用于闭引号超前和逗号超前

尝试:

(?:(?<=")([^"]*)(?="))|(?<=,|^)([^,]*)(?=,|$)
2020-09-09