我知道,现在我有两个问题。但是我很开心!
我从这个建议开始,不是尝试拆分,而是匹配一个可接受的字段,然后从那里扩展到这个表达式。
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"
我想念什么?
运算符优先级。基本上没有。从左到右。因此,或(|)应用于闭引号超前和逗号超前
尝试:
(?:(?<=")([^"]*)(?="))|(?<=,|^)([^,]*)(?=,|$)