JavaScript如何修改正则实现仅按数字前的逗号分割字符串
问题说明
- 分割规则:仅将前侧紧邻数字的逗号作为分割边界对字符串做逗号分割,分割后分组需保留对应数字
- 现存问题:当前代码传入
split的正则逻辑错误,会将值内容中前侧无数字的逗号误判为分割点,导致分组错误 - 需求:修正
split方法接收的第一个正则参数
原有代码
const doSplit = (parameter_type) => parameter_type.split(/(?!\d+)\,\s/).map((option) => { const matches = option.match(/(?<value>.+)\s(?<key>\d+)$/) if(matches === null) { return {Error: {option, parameter_type}} } return matches.groups }) const list_a = "No reaction 0, Up 1, Down 3, Stop 5, Position 1 6, Position 2 7, Position 3 8, Position 4 9, Individual position 10, Enable automatic sun protection 14" console.log(doSplit(list_a)) const list_b = "End position, no overflow 0, End position + 2% overflow 2, End position + 5% overflow 5, End position + 10% overflow 10, End position + 20% overflow 20, Total travel time + 10% Overflow 255" console.log(doSplit(list_b))
修正方案
原正则/(?!\d+)\,\s/使用了负向先行断言,判断的是逗号后侧不匹配数字,和「逗号前侧为数字才分割」的需求完全相反。
直接将split的正则替换为正向肯定后行断言写法,匹配「前侧紧邻数字、后侧带空白字符的逗号」即可:
// 修正后的split正则为 /(?<=\d),\s/ const doSplit = (parameter_type) => parameter_type.split(/(?<=\d),\s/).map((option) => { const matches = option.match(/(?<value>.+)\s(?<key>\d+)$/) if(matches === null) { return {Error: {option, parameter_type}} } return matches.groups })
效果说明
- 对于测试用例
list_a:所有分割点逗号前均为数字,分割结果和预期完全一致 - 对于测试用例
list_b:值内容中End position, no overflow里的逗号前是字母,不会被判定为分割点,会完整保留在value字段中,不会出现错误拆分
内容的提问来源于stack exchange,提问作者elsybilo
相关产品推荐
相关产品推荐

