如何实现兼容单双下划线分隔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
相关产品推荐
相关产品推荐

