按逗号分割字符串忽略引号内逗号的正则失效,求解决方案
问题:分割含引号的CSV字符串并保留空值
给定字符串:
let input = "Bldg ,32.9,-117.11,Yes,California,Yes,San Diego,,\"San Diego, CA\",123"
需要按逗号(,)分割该字符串,但要忽略引号内的逗号,同时保留分割后的空值。此前尝试的正则表达式/[^\",]+|\"([^\"]*)\"/g无法保留空值,无法得到如下预期输出:
["Bldg", "32.9", "-117.11", "Yes", "California", "Yes", "San Diego", "", "San Diego, CA", "123" ]
寻求正确的正则表达式实现方法。
解决方案
可以使用以下正则表达式匹配符合要求的字段(包括空值):
/(?<=^|,)(?:"([^"]*)"|([^,"]*))(?=,|$)/g
正则逻辑说明
(?<=^|,):正向预查,确保当前位置是字符串开头或逗号之后(?:"([^"]*)"|([^,"]*)):匹配两种字段类型:"([^"]*)":匹配带引号的字段,捕获引号内的内容(包含内部逗号)([^,"]*):匹配不带引号的字段,*允许匹配0个字符,以此保留空值
(?=,|$):正向预查,确保当前位置是逗号或字符串结尾
JavaScript代码示例
const input = "Bldg ,32.9,-117.11,Yes,California,Yes,San Diego,,\"San Diego, CA\",123"; const regex = /(?<=^|,)(?:"([^"]*)"|([^,"]*))(?=,|$)/g; const result = []; let match; while ((match = regex.exec(input)) !== null) { // 优先取引号内的捕获内容,无引号则取对应组,空值直接保留"" result.push(match[1] !== undefined ? match[1] : match[2] || ""); } console.log(result);
执行后将得到预期输出,空值被正确保留,引号内的逗号不会触发分割。
内容的提问来源于stack exchange,提问作者Rhea
相关产品推荐
相关产品推荐

