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

单词查找器故障排查:do-while循环及exec()函数问题

问题分析与解决方案

你的代码问题出在全局正则的exec()使用逻辑和do-while循环的结构上,具体问题和修复方案如下:

核心问题

  1. 仅执行一次exec():你只在循环开始前调用了一次w.exec(),之后没有再次调用获取下一个匹配项。如果第一次匹配成功,yes会一直为true,导致无限循环;如果第一次没匹配到,直接退出循环,逻辑完全失效。
  2. 全局正则的lastIndex特性:带g标志的正则会维护lastIndex属性,每次调用exec()会从这个位置开始查找下一个匹配,你没有利用这个特性来遍历所有匹配项。

修复后的代码

方案1:用while循环(更直观)

const words = [/lorem/gi, /ipsum/gi];
// 提前转换body内容为字符串,避免重复操作
const bodyText = String(document.body.innerHTML);
let log = [];

for (const regex of words) {
  let match;
  // 每次调用exec()更新match,直到返回null
  while ((match = regex.exec(bodyText)) !== null) {
    log.push(match);
  }
}

console.log(log);

方案2:保留do-while结构

如果你坚持使用do-while,可以调整逻辑如下:

const words = [/lorem/gi, /ipsum/gi];
const bodyText = String(document.body.innerHTML);
let log = [];

for (const regex of words) {
  let match = regex.exec(bodyText);
  do {
    if (match) {
      log.push(match);
      // 每次处理完当前匹配,调用exec()获取下一个结果
      match = regex.exec(bodyText);
    }
  } while (match !== null);
}

console.log(log);

关键说明

  • 提前将document.body.innerHTML转为字符串并缓存,避免每次exec()都重复转换DOM内容,提升性能。
  • 全局正则的exec()必须被多次调用,才能遍历所有匹配项,每次调用会自动更新lastIndex,直到返回null表示没有更多匹配。
  • 去掉了冗余的yes变量和自定义标签loo,简化逻辑的同时避免循环控制错误。

内容的提问来源于stack exchange,提问作者Mohammad Maaz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:18:28