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

如何实现兼容单双下划线分隔ID的指定子串提取?

问题:提取不同格式ID字符串中的指定子串

需要遍历两种格式的ID字符串,提取其中的5678部分:

  • 示例1:12345_5678
  • 示例2:12345_5678_90

现有代码如下:

//let str = '12345_5678';
let str = '12345_5678_90';

let subStr = str.slice(
  str.indexOf('_') + 1,
  str.lastIndexOf('_'),
);
console.log(subStr);

该代码处理示例2时能正确返回5678,但处理示例1时返回空值——因为字符串只有一个下划线,indexOf('_')和lastIndexOf('_')返回相同位置,导致slice的结束位置小于起始位置,最终返回空字符串。

解决方案

不需要提前判断下划线数量,有两种简洁的处理方式:

方法1:使用split分割字符串

通过下划线分割字符串后,直接取数组的第二个元素(索引为1)即可,无论字符串包含1个还是2个下划线,目标子串的位置都是固定的:

// 处理单下划线ID
const str1 = '12345_5678';
console.log(str1.split('_')[1]); // 输出:5678

// 处理双下划线ID
const str2 = '12345_5678_90';
console.log(str2.split('_')[1]); // 输出:5678

方法2:改进slice逻辑

判断首尾下划线的位置是否相同,若相同(仅一个下划线),则将slice的结束位置设为字符串长度,否则使用最后一个下划线的位置:

function extractTarget(str) {
  const firstUnderline = str.indexOf('_');
  const lastUnderline = str.lastIndexOf('_');
  const endPosition = firstUnderline === lastUnderline ? str.length : lastUnderline;
  return str.slice(firstUnderline + 1, endPosition);
}

console.log(extractTarget('12345_5678')); // 输出:5678
console.log(extractTarget('12345_5678_90')); // 输出:5678

两种方法都能覆盖两种场景,其中split方式代码更简洁,适合这类明确的分割需求;改进slice的方式则延续了原代码的思路,适合需要更精细控制截取范围的场景。

内容的提问来源于stack exchange,提问作者Mikkel Fennefoss

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 16:15:38