使用Java正则环视与非捕获组提取含内部双引号的CSV列
解决非标准带引号CSV的列提取问题
试试这个正则表达式,完全符合你的要求(仅用环视和非捕获组,无需捕获组):
(?<=^|,)"(?:[^"]|(?:""))*"(?=$|,)
正则说明
(?<=^|,):正向预查,确保当前列的前导是行开头或者逗号,能匹配第一列和中间列的起始位置":匹配列开头的双引号(?:[^"]|(?:""))*:非捕获组,负责匹配列内部内容:[^"]:匹配任意非双引号的字符(?:""):匹配两个连续的双引号(CSV中用来表示列内的单个双引号)*:允许上述内容重复任意次数,覆盖所有列内情况
":匹配列结尾的双引号(?=$|,):正向预查,确保当前列的后续是行结尾或者逗号,能匹配中间列和最后一列的结束位置
为什么原正则不行
你之前用的(?<=,).*?(?=,)有两个关键问题:
- 无法匹配第一列(前面没有逗号)和最后一列(后面没有逗号)
- 虽然在测试字符串中能匹配部分中间列,但严格来说没有遵循CSV带引号列的规则,若后续出现列内包含逗号的情况,非贪婪匹配会提前截断内容,而新正则能精准识别配对的双引号边界
用这个正则匹配你的测试字符串:"AAA","BBB","CCC","DDD","EE""E","FFF","GGGGG","HHHHHHHHHHHHHHHH"
会精准提取出每一列的完整内容:"AAA"、"BBB"、"CCC"、"DDD"、"EE""E"、"FFF"、"GGGGG"、"HHHHHHHHHHHHHHHH"
内容的提问来源于stack exchange,提问作者Dan Pickard
相关产品推荐
相关产品推荐

