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

如何定位字符串中第二个匹配单词的索引并截取前缀子串?

截取到第二个"and"之前子串的优化实现方案

原代码局限

你的现有代码仅通过单次indexOf定位第一个"and",要实现定位第二个匹配项,这里提供几种更高效清晰的方案:


方案一:两次indexOf精准定位(推荐)

利用indexOf的第二个参数,指定从第一个匹配位置的下一个字符开始搜索,避免重复匹配同一个"and":

function trail(sen) {
  const target = "and";
  const firstMatchPos = sen.indexOf(target);
  
  // 没有找到第一个"and",直接返回原字符串
  if (firstMatchPos === -1) return sen;
  
  // 从第一个"and"的末尾开始搜索第二个匹配项
  const secondMatchPos = sen.indexOf(target, firstMatchPos + target.length);
  
  // 没有找到第二个"and",返回原字符串
  if (secondMatchPos === -1) return sen;
  
  return sen.substring(0, secondMatchPos);
}

console.log(trail("This is for trails and I want to learn Js and Coding and Development"));
// 输出结果:"This is for trails and I want to learn Js "

优势:原生字符串方法性能最优,逻辑直观,无额外开销,适合固定字符串的匹配场景。


方案二:正则表达式全局匹配(灵活场景)

如果需要支持复杂匹配规则(比如忽略大小写、匹配带空格的"and"等),可以用全局正则表达式:

function trail(sen) {
  const regex = /and/g;
  let matchResult;
  let matchCount = 0;
  
  while ((matchResult = regex.exec(sen)) !== null) {
    matchCount++;
    // 找到第二个匹配项时,截取到该位置
    if (matchCount === 2) {
      return sen.substring(0, matchResult.index);
    }
  }
  
  // 不足两个匹配项时返回原字符串
  return sen;
}

console.log(trail("This is for trails and I want to learn Js and Coding and Development"));
// 输出结果:"This is for trails and I want to learn Js "

优势:支持自定义匹配规则,灵活性强;缺点是性能略低于方案一,适合复杂匹配需求。


方案三:分割重组(简洁场景)

通过split将字符串按"and"分割,取前两部分重新拼接,适合简单场景:

function trail(sen) {
  const splitParts = sen.split("and");
  // 分割后数组长度≥3才说明存在至少两个"and"
  if (splitParts.length < 3) return sen;
  
  // 拼接前两部分和分隔符,还原到第二个"and"之前的内容
  return splitParts[0] + "and" + splitParts[1];
}

console.log(trail("This is for trails and I want to learn Js and Coding and Development"));
// 输出结果:"This is for trails and I want to learn Js "

优势:代码极简;缺点是如果字符串中存在连续分隔符或特殊格式,可能出现预期外结果,仅适合简单场景。


内容的提问来源于stack exchange,提问作者Learn-code

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 22:05:43