如何检查字符串包含多语言特定词汇?英文计数函数非英语环境失效问题
修复多语种环境下的词汇统计函数
你的问题出在正则表达式里的\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
相关产品推荐
相关产品推荐

