2

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

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

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

4

1 回答 1

2

(?<=,|^)并且(?=,|$)是正则表达式断言,用于实现所谓的(分别)正向后视和前瞻。

您的正则表达式(为清楚起见删除了 java 字符串构建引号和连接符)匹配:

"([^"]*)"  // 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

这些结构被称为零宽度,因为它们不消耗测试字符串中的字符。断言的否定版本也存在,使用!而不是=,因此, (?<!,|^)并且(?!,|$)仅当表达式没有在断言之前(lookbehind)或之后(lookahead)时才表示匹配。

更多信息在这里

于 2013-01-07T03:20:06.420 回答