在Java中使用RegEx解析CSV输入

在Java中使用RegEx解析CSV输入

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

我从this advice开始,不是尝试拆分,而是匹配可接受的字段,然后从那里扩展到此表达式。

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"

我想念什么?

最佳答案

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

尝试:

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

关于java - 在Java中使用RegEx解析CSV输入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1441556/

10-10 17:44