好的,所以我查看了如何使用内置功能分解包含引号的csv字符串的各种答案。我已经完成并测试了各种答案,我发现以下字符串有效:
"\"([^\"]*)\"" + //Zero or more not-quoted characters inside of quotes
"|" + //or
"(?<=,|^)" +
"([^,]*)" + //all characters not delimiter
"(?=,|$)" //delimiter or end of string
我正在尝试根据自己的知识解决发生的事情,尤其是上面未注释的部分。任何人都可以提供解释吗?
答案 0 :(得分:2)
(?<=,|^)
和(?=,|$)
是正则表达式断言,用于实现所谓的(分别)正向lookbehind和lookahead。
你的正则表达式(为了清楚起见,删除了java字符串构建引号和concats)匹配:
"([^"]*)" // 0+ not-quote characters inside of quotes (captured)
| // OR
([^,]*) // any 0+ character which is not , (captured) only if
(?<=,|^) // preceded by , or at start of line AND
(?=,|$) // followed by , or at end of line
这些结构称为零宽度,因为它们不会消耗测试字符串中的字符。断言的否定版本也存在,使用!
而不是=
,因此(?<!,|^)
和(?!,|$)
只有在表达式不在(后观)或后面的情况下才会匹配(通过断言来预测。
更多信息here。