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

HTML文本词频统计功能故障:Chai测试特定用例未通过求解决

HTML文本统计功能优化方案

一、先确认有效文本提取的准确性

首先得保证extractHTMLContent真的把script标签和HTML注释彻底清掉了,这一步出错的话后续统计全白搭:

  • 移除script标签用正则:<script[^>]*>[\s\S]*?</script>,必须用非贪婪匹配(*?),不然会把script标签后面的所有内容都吞掉
  • 移除HTML注释用正则:<!--[\s\S]*?-->,同样用非贪婪匹配避免误删正常内容
  • 测试时直接打印提取后的文本,确认没有残留的script代码或注释内容

二、修复countOccurence的正则逻辑

你遇到的两个测试用例问题,核心是正则的边界匹配和特殊字符转义没做好:

1. 单个单词(如'clock')统计错误

  • 问题根源:如果用了/clock/g这种无边界的正则,会把包含clock的长单词(比如clockwise)也算作匹配结果,导致返回非0
  • 优化方案:用自定义边界代替原生\b(\b对带撇号的单词兼容性差),比如匹配前后为空白、引号、撇号或字符串首尾:
    // 匹配独立单词的正则
    const regex = new RegExp(`(?:^|\\s|['"])clock(?:$|\\s|['"])`, 'gi');
    
    这样只会统计独立出现的clock,不会误匹配包含它的其他单词

2. 带特殊字符的句子统计错误

  • 问题根源:待匹配文本中的特殊字符(如撇号'、句号.)没有转义,被当作正则元字符处理,导致无法精确匹配
  • 优化方案:
    1. 先写一个正则特殊字符转义函数:
      function escapeRegExp(str) {
        return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
      }
      
    2. 根据测试要求构建正则:
      • 如果要匹配独立短语(要求短语前后是分隔符或字符串首尾):
        function countOccurence(text, target) {
          const escapedTarget = escapeRegExp(target);
          const regex = new RegExp(`(?:^|\\W)(${escapedTarget})(?:$|\\W)`, 'gi');
          const matches = text.match(regex) || [];
          return matches.length;
        }
        
      • 如果只是精确子串匹配(不需要独立短语),直接用转义后的字符串构建全局正则即可

三、额外注意事项

  • HTML实体处理:如果提取的文本里有&apos;这类实体字符,要转换为普通撇号,否则匹配带撇号的目标文本时会失败
  • 大小写敏感:确认测试用例是否忽略大小写,正则需要加i标志就加上
  • 分步测试:先单独验证extractHTMLContent的输出,再单独测试countOccurence的逻辑,定位问题更快

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 13:44:50