JavaScript正则需求:忽略符号匹配含分隔符的目标数字段
解决注册号符号段匹配问题
核心思路
要实现输入无符号数字串返回原注册号中对应带符号的段,关键是先拆解原注册号的数字序列和符号位置,再根据输入数字的位置映射回带符号的片段:
- 提取原注册号的纯数字序列,同时记录每个符号在数字序列中的插入位置(即符号前有多少个数字)。
- 找到输入数字串在纯数字序列中的起止位置,然后在遍历输入数字时,插入对应位置的符号。
代码实现
// 原注册号 const regNumber = '12.325.767/0001-90'; // 提取纯数字序列和符号位置映射 const digitSequence = regNumber.replace(/[^0-9]/g, ''); const symbolMap = []; let digitCount = 0; for (const char of regNumber) { if (!/\d/.test(char)) { symbolMap.push({ position: digitCount, symbol: char }); } else { digitCount++; } } // 匹配目标数字串对应的带符号段 function getSegment(targetDigits) { const startIndex = digitSequence.indexOf(targetDigits); if (startIndex === -1) return null; // 未匹配到返回null const endIndex = startIndex + targetDigits.length - 1; // 筛选出目标数字区间内的符号 const relevantSymbols = symbolMap.filter(s => s.position > startIndex && s.position <= endIndex ); // 拼接结果字符串 let result = ''; let digitPos = 0; let symbolIdx = 0; for (let i = startIndex; i <= endIndex; i++) { result += targetDigits[digitPos]; digitPos++; // 检查当前数字后是否需要插入符号 const currentSymbol = relevantSymbols[symbolIdx]; if (currentSymbol && currentSymbol.position === i + 1) { result += currentSymbol.symbol; symbolIdx++; } } return result; } // 测试用例 console.log(getSegment('23')); // 输出 "2.3" console.log(getSegment('700')); // 输出 "7/00" console.log(getSegment('19')); // 输出 "1-9"
代码说明
digitSequence:把原注册号中的非数字字符全部去掉,得到纯数字串,示例中为12325767000190。symbolMap:记录每个符号的位置,比如示例中的.在第2个数字后,/在第8个数字后,以此类推。getSegment函数:先找到输入数字在纯数字序列中的位置,再遍历该区间,遇到符号位置就插入对应的符号,最终返回带符号的片段。
内容的提问来源于stack exchange,提问作者Caio b .
相关产品推荐
相关产品推荐

