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

ExtendScript正则表达式在InDesign脚本中不符合预期问题排查

ExtendScript中CSV拆分正则失效问题排查与替代方案

问题场景

我在为Adobe InDesign编写ExtendScript脚本,处理Excel导出的CSV文件。由于CSV中存在引号包裹的内容含逗号的情况,直接用split(",")会错误拆分单元格,因此采用了以下正则表达式来拆分:

/,(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/g

测试用的CSV行内容为:

[SP],"Example 3/8"" Wrench, (2) Screwdrivers","Example 3/8"" Wrench, (2) Screwdrivers"

预期拆分后得到3个单元格:

Cell 1Cell 2Cell 3
[SP]Example 3/8" Wrench, (2) ScrewdriversExample 3/8" Wrench, (2) Screwdrivers

但同样的拆分代码在标准JavaScript中正常运行,在ExtendScript里却出现异常:

var csvData = csvLine.split(/,(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/g);

实际得到的结果:

Cell 1Cell 2Cell 3
[SP]Example 3/8"" WrenchExample 3/8" Wrench, (2) Screwdrivers

第二个单元格被错误截断,请问这是ExtendScript的bug,还是用法有误?有没有适用于ExtendScript的替代方案?

原因分析

ExtendScript基于ECMAScript 3标准,其正则引擎对复杂正向预查的支持存在局限,原正则中的嵌套正向预查结构在旧引擎中无法正确解析,导致split时错误识别了分隔逗号的位置。

替代方案

改用匹配模式而非split来提取单元格内容,这种方式更兼容旧版正则引擎,同时能正确处理CSV中的转义引号("")和内部逗号:

实现代码

var csvLine = '[SP],"Example 3/8"" Wrench, (2) Screwdrivers","Example 3/8"" Wrench, (2) Screwdrivers"';
// 匹配规则:要么是带引号的内容(允许内部出现""),要么是不含逗号的内容
var cellRegex = /"([^"]|"")*"|[^,]+/g;
var rawCells = csvLine.match(cellRegex);
var csvData = [];

if (rawCells) {
    rawCells.forEach(function(cell) {
        // 处理带引号的单元格:去除首尾引号,将""替换为"
        if (cell.charAt(0) === '"' && cell.charAt(cell.length - 1) === '"') {
            cell = cell.substring(1, cell.length - 1).replace(/""/g, '"');
        }
        csvData.push(cell);
    });
}

// 输出结果符合预期:
// csvData = ["[SP]", "Example 3/8\" Wrench, (2) Screwdrivers", "Example 3/8\" Wrench, (2) Screwdrivers"]

原理说明

  1. 正则/"([^"]|"")*"|[^,]+/g会匹配两种内容:
    • 带双引号包裹的字符串:允许内部出现转义引号""
    • 不含逗号的普通字符串(对应未被引号包裹的单元格)
  2. 对匹配到的结果做二次处理:去掉首尾引号,并将""替换为单个",还原Excel导出的转义内容。

内容的提问来源于stack exchange,提问作者Andrew Krill

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 22:05:00