You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

按逗号分割字符串忽略引号内逗号的正则失效,求解决方案

问题:分割含引号的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 08:57:47