如何定位字符串中第二个匹配单词的索引并截取前缀子串?
截取到第二个"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
相关产品推荐
相关产品推荐

