在JavaScript开发中,截取两个相同字符之间的字符串是高频需求,比如从格式为name:张三;age:20;city:北京的字符串中提取冒号之间的内容,或者从包含多个相同分隔符的文本中获取指定区间的内容。下面介绍几种常用的实现方式。

方法一:使用split分割字符串
split方法可以将字符串按照指定分隔符拆分为数组,通过数组下标即可获取两个相同字符之间的内容。这种方式适合分隔符出现次数较少、目标内容位置固定的场景。
// 示例:截取两个#之间的字符串
const str = 'abc#目标内容#def#其他内容#ghi';
// 按照#分割字符串,得到数组
const arr = str.split('#');
// 两个#之间的内容在数组下标1的位置
const result = arr[1];
console.log(result); // 输出:目标内容
如果分隔符出现多次,需要调整下标获取对应位置的内容,比如要获取第二个和第三个#之间的内容,下标就改为2即可。
方法二:使用indexOf配合substring截取
indexOf方法可以获取指定字符在字符串中首次出现的位置,通过两次调用indexOf分别获取两个相同字符的位置,再用substring截取区间内容。这种方式适合需要灵活控制截取区间的场景。
// 示例:截取两个@之间的字符串
const str = 'test@中间内容@end@more';
// 获取第一个@的位置
const firstIndex = str.indexOf('@');
// 获取第一个@之后第二个@的位置
const secondIndex = str.indexOf('@', firstIndex + 1);
// 截取两个@之间的内容,不包含@本身
const result = str.substring(firstIndex + 1, secondIndex);
console.log(result); // 输出:中间内容
需要注意如果字符串中不足两个目标字符,secondIndex会返回-1,此时需要做边界判断避免报错。
方法三:使用正则表达式匹配
正则表达式可以更灵活地匹配两个相同字符之间的内容,适合分隔符出现次数不固定、需要批量提取或者匹配复杂规则的场景。
// 示例:匹配两个$之间的内容,支持贪婪和非贪婪模式 const str = 'start$第一个$test$middle$end'; // 非贪婪匹配,匹配最短的两个$之间的内容 const reg1 = /$(.*?)$/; const result1 = str.match(reg1); console.log(result1[1]); // 输出:第一个 // 贪婪匹配,匹配最长的两个$之间的内容 const reg2 = /$(.*)$/; const result2 = str.match(reg2); console.log(result2[1]); // 输出:第一个$test$middle
正则中的.*?表示非贪婪匹配,会尽可能少地匹配字符;.*是贪婪匹配,会尽可能多地匹配字符,根据实际需求选择对应的模式即可。
不同方法的对比与选择
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| split分割 | 代码简洁,逻辑直观 | 需要提前知道目标内容在数组中的位置 | 分隔符少、目标位置固定 |
| indexOf+substring | 可灵活控制截取区间,边界可控 | 需要多次调用方法,代码稍长 | 需要动态定位字符位置 |
| 正则匹配 | 支持复杂匹配规则,可批量提取 | 正则语法有一定学习成本 | 分隔符多、规则复杂、需要批量处理 |
注意事项
- 使用split方法时,如果分隔符在字符串开头或结尾,会产生空字符串元素,需要提前处理。
- 使用indexOf方法时,一定要判断返回的位置是否为-1,避免截取时出现异常。
- 正则匹配时,如果目标字符串中包含换行符,需要给正则添加
s修饰符,让.可以匹配换行符。
实际开发中可以根据具体的字符串格式和需求选择合适的方法,简单的场景优先用split或者indexOf方案,复杂场景再考虑正则匹配,既能保证代码可读性,也能提升执行效率。
JavaScript字符串截取正则匹配substringsplit修改时间:2026-07-20 03:51:27