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

如何检查字符串包含多语言特定词汇?英文计数函数非英语环境失效问题

修复多语种环境下的词汇统计函数

你的问题出在正则表达式里的\b单词边界上——这个语法只认ASCII字符集中的“单词字符”(也就是a-z、A-Z、0-9和下划线),对于阿拉伯语这类非拉丁字符的语言,\b根本没法正确识别单词的起止边界,自然匹配不到结果。

我给你调整一下函数,用Unicode属性类和环视断言来解决这个问题,同时保留原有的大小写不敏感逻辑:

function countWordInString(str, word) {
    const upperStr = str.toUpperCase();
    const upperWord = word.toUpperCase();
    // 使用Unicode字母属性配合环视,精准匹配多语种单词边界
    const regex = new RegExp(`(?<!\\p{L})${upperWord}(?!\\p{L})`, 'gu');
    const matches = upperStr.match(regex);
    return matches ? matches.length : 0;
}

关键修改说明:

  • \p{L}是Unicode属性类,能匹配任何语言的字母(包括阿拉伯语、中文、日语等),配合u修饰符才能生效
  • (?<!\p{L})是负向后行断言:确保目标单词的前面不是任何语言的字母,模拟“单词开头”的边界
  • (?!\p{L})是负向前瞻断言:确保目标单词的后面不是任何语言的字母,模拟“单词结尾”的边界
  • 保留了toUpperCase()的逻辑,保证大小写不敏感的匹配效果

测试验证:

// 英语环境测试
console.log(countWordInString('hello world', 'hello')); // 输出 1 ✅

// 阿拉伯语环境测试
console.log(countWordInString('مرحبا بالعالم مرحبا', 'مرحبا')); // 输出 2 ✅

如果你的场景里单词可能和数字连在一起,只需要把\p{L}改成\p{Letter}|\p{Number}就行,灵活调整边界规则就好。

内容的提问来源于stack exchange,提问作者Ba Trần

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:26:04