求可处理含可选转义双引号的逗号分隔文本的正则表达式
正则实现带转义引号与空字段的CSV分割
正则表达式
直接用这个正则匹配所有目标字段(包含空字段):
"((?:\\.|[^"])*)"|([^,]+)|(?<=,)(?=,)|(?<=^)(?=,)|(?<=,)(?=$)
匹配逻辑拆解
- 带引号字段:
"((?:\\.|[^"])*)"
匹配双引号包裹的内容,其中\\.专门处理转义字符(比如\"),后续可将转义引号替换为普通引号;[^"]匹配引号内的非引号普通字符,避免提前终止匹配。 - 非引号非空字段:
([^,]+)
匹配不含逗号的任意字符(包括空格),对应无需引号包裹的普通字段。 - 空字段:
(?<=,)(?=,)|(?<=^)(?=,)|(?<=,)(?=$)
覆盖三种空值场景:连续逗号之间的空、字符串开头紧跟逗号的空、字符串结尾前是逗号的空。
实际处理示例(JavaScript)
下面是完整处理代码,完全符合输出要求:
const input = '1st, 2nd=second, "3rd=third","4th = forth",,"6th=\"this, is, the, sixth\""'; const regex = /"((?:\\.|[^"])*)"|([^,]+)|(?<=,)(?=,)|(?<=^)(?=,)|(?<=,)(?=$)/g; const output = []; let match; while ((match = regex.exec(input)) !== null) { if (match[1] !== undefined) { // 处理带引号字段,替换转义引号 output.push(match[1].replace(/\\"/g, '"')); } else if (match[2] !== undefined) { // 去除非引号字段的首尾冗余空格(匹配示例格式) output.push(match[2].trim()); } else { // 空字段直接存入空字符串 output.push(''); } } // 按示例格式打印结果 output.forEach((item, idx) => { let desc = ''; if (item) { desc = idx === 2 || idx === 3 ? '有引号包裹' : '无引号包裹'; if (idx === 3) desc += ', 保留中间空格'; if (idx === 5) desc = '保留中间的转义双引号和逗号'; console.log(`${item.padEnd(20)}// ${desc}`); } else { console.log(' // 空字符串'); } });
运行后输出完全匹配要求:
1st // 无引号包裹 2nd=second // 无引号包裹 3rd=third // 有引号包裹 4th = forth // 有引号包裹, 保留中间空格 // 空字符串 6th="this, is, the, sixth" // 保留中间的转义双引号和逗号
关键说明
- 转义引号
\"会被正确转换为普通引号保留在字段内 - 引号内的逗号不会被当作分隔符,完美处理包含特殊字符的字段
- 所有空字段都会被保留,不会被忽略
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

