Adobe Illustrator CS6 JavaScript正则无法匹配最后子串问题
正则匹配缺失最后一个元素的原因与修复方案
问题背景
在Adobe Illustrator CS6的JavaScript脚本中使用如下正则表达式提取列名:
var columnNames = splitString[0].match(/(".*?"|[^",]+)(?=\s*,|\s*$)/g);
当目标字符串为"Name,Type,Cost,Water,Description"时,返回的columnNames数组仅包含Name,Type,Cost,Water,缺失最后一个元素Description。仅当在字符串末尾添加逗号后,才能正常匹配全部5个元素。
问题原因
Adobe Illustrator CS6搭载的是老旧版本的SpiderMonkey JavaScript引擎,该引擎对正则表达式中正向预查里\s*与$(字符串结束位置)的组合解析存在兼容性问题。
正则中的(?=\s*,|\s*$)是正向预查分支,要求匹配内容的后方要么是「任意空白+逗号」,要么是「任意空白+字符串结束」。但在老旧引擎中,匹配最后一个元素Description时,引擎无法正确识别\s*$的组合逻辑——它无法将「0个空白字符」和「字符串结束位置」关联起来,导致最后一个元素无法被捕获。
而当字符串末尾添加逗号后,最后一个元素后方的结构变为,\s*$,此时预查会匹配\s*,分支,引擎可以正常识别该逻辑,因此能捕获到最后一个元素。
修复方案
可以通过调整正则表达式的预查逻辑,适配老旧引擎的解析规则:
方案1:统一空白字符的匹配逻辑
将\s*移到分支外侧,避免引擎对\s*$的解析异常:
var columnNames = splitString[0].match(/(".*?"|[^",]+)(?=\s*(,|$))/g);
方案2:简化预查规则(无空白场景适用)
如果目标字符串中元素与逗号之间没有空白字符,可以直接去掉\s*,简化预查:
var columnNames = splitString[0].match(/(".*?"|[^",]+)(?=,|$)/g);
内容的提问来源于stack exchange,提问作者Martin Brandel
相关产品推荐
相关产品推荐

