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. 带特殊字符的句子统计错误
- 问题根源:待匹配文本中的特殊字符(如撇号
'、句号.)没有转义,被当作正则元字符处理,导致无法精确匹配 - 优化方案:
- 先写一个正则特殊字符转义函数:
function escapeRegExp(str) { return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); } - 根据测试要求构建正则:
- 如果要匹配独立短语(要求短语前后是分隔符或字符串首尾):
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实体处理:如果提取的文本里有
'这类实体字符,要转换为普通撇号,否则匹配带撇号的目标文本时会失败 - 大小写敏感:确认测试用例是否忽略大小写,正则需要加
i标志就加上 - 分步测试:先单独验证
extractHTMLContent的输出,再单独测试countOccurence的逻辑,定位问题更快
内容的提问来源于stack exchange,提问作者Steviggio
相关产品推荐
相关产品推荐

