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 1 | Cell 2 | Cell 3 |
|---|---|---|
| [SP] | Example 3/8" Wrench, (2) Screwdrivers | Example 3/8" Wrench, (2) Screwdrivers |
但同样的拆分代码在标准JavaScript中正常运行,在ExtendScript里却出现异常:
var csvData = csvLine.split(/,(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/g);
实际得到的结果:
| Cell 1 | Cell 2 | Cell 3 |
|---|---|---|
| [SP] | Example 3/8"" Wrench | Example 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"]
原理说明
- 正则
/"([^"]|"")*"|[^,]+/g会匹配两种内容:- 带双引号包裹的字符串:允许内部出现转义引号
"" - 不含逗号的普通字符串(对应未被引号包裹的单元格)
- 带双引号包裹的字符串:允许内部出现转义引号
- 对匹配到的结果做二次处理:去掉首尾引号,并将
""替换为单个",还原Excel导出的转义内容。
内容的提问来源于stack exchange,提问作者Andrew Krill
相关产品推荐
相关产品推荐

