JavaScript如何用正则按点分割字符串且不拆分双引号内内容
正则调整方案
问题原因
你当前使用的正则仅匹配了双引号包裹内容、无点无空格的普通标识符两类结构,没有将字段后跟随的数组索引部分(如[0])纳入匹配范围,因此最后一个分段会被截断为"array.nested.1",丢失后续索引内容。
方案1:使用split方法实现(符合要求)
直接匹配不在双引号内部的.作为分割符即可,实现逻辑更简单:
const str = '"root.doted"."nested.dots"."array.nested.1"[0]'; // 按不在引号内的点分割 const result = str.split(/\.(?=(?:[^"]*"[^"]*")*[^"]*$)/); console.log(result); // 输出:['"root.doted"', '"nested.dots"', '"array.nested.1"[0]']
正则解释:
\.匹配字面量点(?=(?:[^"]*"[^"]*")*[^"]*$)正向前瞻断言,校验当前点后方的双引号总数量为偶数,说明当前点不在双引号包裹范围内,是合法的分段分隔符
方案2:匹配提取模式(和你原有写法思路一致)
如果你更倾向于用match方法直接提取分段,调整原有正则加入索引匹配规则即可:
const str = '"root.doted"."nested.dots"."array.nested.1"[0]'; const reg = /("[^"]*"|[^".\s]+)(?:\[\d+])*(?=\s*\.|\s*$)/g; const result = str.match(reg); console.log(result); // 输出结果和要求一致
正则调整说明:
- 新增
(?:\[\d+])*非捕获组,匹配0个或多个后置的数组索引结构,确保索引会和前面的字段名拼接为完整分段
内容的提问来源于stack exchange,提问作者mozenge
相关产品推荐
相关产品推荐

