登录
首页 >  文章 >  前端

JS统计字符串单词频率的技巧

时间:2026-03-27 15:48:46 389浏览 收藏

本文详解了如何利用JavaScript正则表达式(/[a-z0-9]+/gi)结合match()与reduce()高效统计字符串中单词出现频次——先精准提取字母数字组合的单词、自动忽略大小写与标点,再通过健壮的空值防护和小写归一化确保统计准确性,最终生成清晰的{word: count}计数对象;代码简洁可复用,还支持扩展停用词过滤与Map替代方案,是文本分析与数据预处理中实用又易懂的核心技巧。

JavaScript中利用正则统计字符串中单词出现的频率

可以用正则表达式配合 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 步骤。

今天关于《JS统计字符串单词频率的技巧》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>