可用正则表达式配合match()和reduce()统计单词频次:先用/[a-z0-9]+/gi提取单词并转小写,再用reduce构建计数对象,空值需防护,结果为{word: count}格式。

可以用正则表达式配合 match() 和 reduce() 快速统计单词频次,关键是正确提取“单词”(通常指连续的字母数字字符,忽略大小写和标点)。
提取所有单词(忽略大小写和标点)
使用正则 /[a-z0-9]+/gi 匹配至少一个字母或数字组成的子串,g 全局匹配,i 忽略大小写。这样能跳过空格、标点、换行等非单词字符。
例如:
"Hello, world! Hello JavaScript123." → ["Hello", "world", "Hello", "JavaScript123"]转为小写统一计数
为避免 "Hello" 和 "hello" 被视为不同单词,建议在提取后统一转小写。可在 match() 后链式调用 map(w => w.toLowerCase()),或在 reduce 中处理。
- 直接在匹配后转换:
str.match(/[a-z0-9]+/gi)?.map(w => w.toLowerCase()) || [] - 空值防护很重要:
match()在无匹配时返回null,需提供默认空数组
用 reduce 统计频次
遍历单词数组,用对象累积计数:
const freq = words.reduce((acc, word) => {
acc[word] = (acc[word] || 0) + 1;
return acc;
}, {});
结果是形如 { hello: 2, world: 1, javascript123: 1 } 的对象。
- 也可用
Map替代普通对象,更安全(避免原型污染) - 若需按频次排序,后续可对
Object.entries(freq)使用sort()
完整示例函数
封装成可复用函数:
function wordFrequency(str) {
const words = str.match(/[a-z0-9]+/gi)?.map(w => w.toLowerCase()) || [];
return words.reduce((acc, word) => {
acc[word] = (acc[word] || 0) + 1;
return acc;
}, {});
}
// wordFrequency("Hi there! Hi again.") → { hi: 2, there: 1, again: 1 }
如需排除停用词(如 "the", "and"),可在 map 前加 filter 步骤。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











