我知道,现在我有两个问题。但是我很开心!
我从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/