如何编写正则表达式修复Figma API返回的畸形矢量路径字符串
矢量路径字符串格式修正正则方案
核心匹配逻辑
我们需要处理两类紧挨着的非法拼接场景:
- 路径命令字母后直接接数字/负号(如
M0、L-2) - 数字后直接接路径命令字母(如
0L、4Z)
正则仅匹配SVG标准定义的路径命令字母M/m、L/l、H/h、V/v、C/c、S/s、Q/q、T/t、A/a、Z/z,不会误判科学计数法里的指数标记e/E。
正则表达式及替换规则
一步到位方案(零宽断言匹配位置,直接插入空格)
匹配正则:
(?<=\d)(?=[mlhvcsqtazMLHVCSQTAZ])|(?<=[mlhvcsqtazMLHVCSQTAZ])(?=\d|-)
替换内容:单个空格
兼容性分步方案(部分老旧语言不支持零宽断言时使用)
第一步:处理数字后接路径命令的场景
匹配正则:
(\d)([mlhvcsqtazMLHVCSQTAZ])
替换为:$1 $2(部分语言用\1 \2作为分组占位符)
第二步:处理路径命令后接数字/负号的场景
匹配正则:
([mlhvcsqtazMLHVCSQTAZ])(\d|-)
替换为:$1 $2
常用语言实现示例
JavaScript 示例
const invalidPath = 'M0 0L1.33333 0L1.33333 4L4.44089e-16 4L0 0Z'; const validPath = invalidPath.replace(/(?<=\d)(?=[mlhvcsqtazMLHVCSQTAZ])|(?<=[mlhvcsqtazMLHVCSQTAZ])(?=\d|-)/g, ' '); // 输出结果:M 0 0 L 1.33333 0 L 1.33333 4 L 4.44089e-16 4 L 0 0 Z
Python 示例
import re invalid_path = 'M0 0L1.33333 0L1.33333 4L4.44089e-16 4L0 0Z' valid_path = re.sub(r'(?<=\d)(?=[mlhvcsqtazMLHVCSQTAZ])|(?<=[mlhvcsqtazMLHVCSQTAZ])(?=\d|-)', ' ', invalid_path) # 输出结果:M 0 0 L 1.33333 0 L 1.33333 4 L 4.44089e-16 4 L 0 0 Z
内容的提问来源于stack exchange,提问作者crowhill
相关产品推荐
相关产品推荐

