环境信息
软件:Hamibot
JS 引擎:Rhino 1.7.15
脚本场景:抖音私信自动采集脚本,提取混杂中文消息里的大写开头微信号(如 WLAImob123)
现象
纯小写格式微信号(如 wlaimob123)可以正常被正则匹配并提取,存入 wxList 字段
大写 / 大小写混合开头微信号(如 WLAImob123)无法被正确提取,wxList 为空、日志显示微信号 = 无
✅ 原始整条私信文本可完整读取,不存在文本截断、隐藏字符、过滤误删问题
✅ 正则字符集已写 [a-zA-Z],语法本身支持大小写字母
✅ 仅在用 while + regex.exec(text) + /g 全局循环写法时,大写 ID 匹配失败;小写 ID 正常
✅ 非 while-exec 单次匹配时,可正常识别大写字母 ID,仅全局循环 exec 写法异常
✅ 其余页面抓取、自动回复、文件读写、缓存逻辑均正常运行
核心疑似问题
Rhino 1.7.15 JS 引擎存在 RegExp.exec () 全局 /g 模式循环匹配时 lastIndex 索引异常 BUG:
在包含中文上下文 + 大写字母 ID 场景下,while 循环反复调用 exec 会造成正则匹配索引错位,无法正确捕获大写分组内容
仅影响 while + exec + /g 全局遍历写法,不影响单次 match 匹配、纯小写 ID 匹配
不符合标准 JS 正则 exec 全局匹配行为,属于 Rhino 引擎底层兼容性问题
诉求
确认 Rhino 1.7.15 版本在全局 /g 正则模式下 while exec 循环是否存在 lastIndex 索引异常 bug,是否存在大小写字符处理差异问题,以及官方推荐的兼容全局正则匹配写法。

HAMI_6893877807 · 12 小时前

回答

Hamibot AI
1
· 12 小时前

对于你在 Rhino 1.7.15 环境中遇到的 while + regex.exec(text) + /g 循环匹配大写字母时失败的问题,虽然我无法直接确认该引擎是否存在特定的 lastIndex 索引异常 bug,但根据 Hamibot 的脚本兼容性要求,推荐避免使用 while 循环配合 exec 全局匹配的写法,因为这种方式容易在不同引擎间出现行为差异。

推荐兼容写法:使用 String.prototype.match() 直接获取所有匹配项

文档地址 https://docs.hamibot.com/

// 文档地址 https://docs.hamibot.com/
var text = "你的消息内容,包含 WLAImob123 和 wlaimob123 等";
var regex = /[a-zA-Z][a-zA-Z0-9_]{5,19}/g; // 按照你的微信号规则调整
var matches = text.match(regex);
if (matches) {
    // matches 是一个数组,包含所有匹配到的微信号
    for (var i = 0; i < matches.length; i++) {
        log("微信号: " + matches[i]);
    }
} else {
    log("未匹配到微信号");
}

为什么这样更可靠:

  • match 结合全局标志 /g 会一次性返回所有匹配结果的数组,无需手动管理 lastIndex,语法简单且行为在各引擎中更一致。
  • 避免 exec 循环中可能出现的索引错位问题,尤其是在包含中文等多字节字符的文本中。
ℹ️ 内容由 AI 生成,可能不准确,请注意核实