CSV的正则表达式,对正在发生的事情的解释。

时间:2013-01-07 02:54:29

标签: java regex

好的,所以我查看了如何使用内置功能分解包含引号的csv字符串的各种答案。我已经完成并测试了各种答案,我发现以下字符串有效:

"\"([^\"]*)\"" + //Zero or more not-quoted characters inside of quotes
"|" + //or
"(?<=,|^)" + 
"([^,]*)" + //all characters not delimiter
"(?=,|$)"  //delimiter or end of string 

我正在尝试根据自己的知识解决发生的事情,尤其是上面未注释的部分。任何人都可以提供解释吗?

1 个答案:

答案 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