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

如何在JavaScript中统计无重音英文字母的数量?

如何正确统计字符串中无重音英文字母的数量?

要准确统计无重音的英文字母(比如示例字符串"né!"应返回1),核心要解决两个问题:带重音的字母可能是预组合字符(如é对应U+00E9)或组合字符序列(如e+重音符号U+0301),直接的字符范围判断或简单正则会出现误判。

方法一:直接匹配ASCII英文字母(最简洁)

无重音的英文字母就是ASCII码范围内的a-z(97-122)和A-Z(65-90),用正则[a-zA-Z]精准匹配这类字符即可:

const str = "né!";
const asciiLetterRegex = /[a-zA-Z]/g;
const matchResults = str.match(asciiLetterRegex);
const count = matchResults ? matchResults.length : 0;

console.log(count); // 输出1

这个正则只会匹配纯ASCII的大小写字母,不管重音字符是预组合还是拆分的形式,都不会被纳入统计,完全符合需求。

方法二:标准化字符串后过滤(更灵活)

如果需要处理更复杂的场景,可先通过String.normalize('NFD')将字符串转换为规范分解形式,把所有预组合的重音字符拆成「基础字母+重音标记」,再只统计ASCII范围内的字母:

function countNonAccentedEnglishLetters(str) {
  // 标准化为分解形式,重音字符会拆成基础字母+标记
  const normalizedStr = str.normalize('NFD');
  let count = 0;

  for (const char of normalizedStr) {
    const codePoint = char.codePointAt(0);
    // 只统计ASCII的大小写英文字母
    if ((codePoint >= 65 && codePoint <= 90) || (codePoint >= 97 && codePoint <= 122)) {
      count++;
    }
  }

  return count;
}

console.log(countNonAccentedEnglishLetters("né!")); // 输出1
console.log(countNonAccentedEnglishLetters("Café au Lait")); // 输出8

解释你之前遇到的问题

  1. 字符范围判断失效:你测试'é' >= 'a' && 'é' <= 'z'返回true,大概率是因为字符串中的é是组合字符序列(e+重音符号),JavaScript的字符串比较是按码点序列排序,会把这个序列和单个字母的码点做排序对比,导致误判。
  2. 循环正则的错误输出:"né!"被拆成n、e、́、!四个字符,是因为é是组合形式,循环逐个判断时会把拆分出来的e当成独立的无重音字母,这显然不符合你的需求——我们要排除的是整个带重音的字母,而不是拆分后的基础字符。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 23:42:29