好了,我已经看过了关于如何使用内置功能使用包含引号来拆分csv字符串的各种答案。我已经检查并测试了各种答案,我发现以下字符串是有效的:
"\"([^\"]*)\"" + //Zero or more not-quoted characters inside of quotes
"|" + //or
"(?<=,|^)" +
"([^,]*)" + //all characters not delimiter
"(?=,|$)" //delimiter or end of string
我试着用我自己的知识来弄清楚到底是怎么回事,尤其是上面那段未被评论的部分。有谁能解释一下吗?
发布于 2013-01-07 03:20:06
(?<=,|^)
和(?=,|$)
是正则表达式断言,用于实现所谓的(分别)正向后视和前视。
您的正则表达式(为清晰起见,删除了构建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
这些构造被称为零宽度,因为它们不消耗测试字符串中的字符。还存在断言的否定版本,使用!
而不是=
,因此只有当表达式之前(后视)或后面(前视)没有断言时,(?<!,|^)
和(?!,|$)
才意味着匹配。
更多信息here。
https://stackoverflow.com/questions/14189228
复制