You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript正则需求:忽略符号匹配含分隔符的目标数字段

解决注册号符号段匹配问题

核心思路

要实现输入无符号数字串返回原注册号中对应带符号的段,关键是先拆解原注册号的数字序列和符号位置,再根据输入数字的位置映射回带符号的片段:

  1. 提取原注册号的纯数字序列,同时记录每个符号在数字序列中的插入位置(即符号前有多少个数字)。
  2. 找到输入数字串在纯数字序列中的起止位置,然后在遍历输入数字时,插入对应位置的符号。

代码实现

// 原注册号
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 .

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 07:51:34