JavaScript正则词频统计:匹配单词内撇号、排除首尾撇号支持重音字符
解决方案
核心思路是通过正则直接捕获单词的有效部分,自动忽略首尾撇号,同时保留单词内部的撇号,兼容带变音符号的字符。
正则说明
你可以使用以下正则结构实现需求:
'*([A-Za-zÀ-ÖØ-öø-ÿ]+(?:['’][A-Za-zÀ-ÖØ-öø-ÿ]+)*)'*
各部分逻辑:
- 首尾的
'*匹配单词前后任意数量的撇号,不纳入最终有效单词内容 - 捕获组
()内是我们需要的有效单词:[A-Za-zÀ-ÖØ-öø-ÿ]+匹配至少1个合法字符(包含英文字母和带变音符号的字符)(?:['’][A-Za-zÀ-ÖØ-öø-ÿ]+)*是非捕获组,匹配「撇号+合法字符」的组合,允许出现0次或多次,保证撇号只会出现在两个合法字符中间,不会出现在单词首尾
完整实现代码
const countWords = (text) => { const letterRange = 'A-Za-zÀ-ÖØ-öø-ÿ' const wordRegex = new RegExp(`'*([${letterRange}]+(?:['’][${letterRange}]+)*)'*`, 'g') const counts = {} let match while ((match = wordRegex.exec(text)) !== null) { // 如果需要区分大小写统计,删除.toLowerCase()即可 const word = match[1].toLowerCase() counts[word] = (counts[word] || 0) + 1 } return counts } // 测试用例 const testText = "it's a 'miracle' of nature" console.log(countWords(testText)) // 输出:{ "it's": 1, a: 1, miracle: 1, of: 1, nature: 1 }
效果验证
对于你给出的测试文本it's a 'miracle' of nature,会正确统计为5个单词,'miracle'自动移除首尾撇号为miracle,it's保留内部撇号作为完整单词,完全符合预期。
内容的提问来源于stack exchange,提问作者Rodrigo
相关产品推荐
相关产品推荐

