JavaScript正则表达式无法匹配含瑞典语字母ÅÄÖ的双字母完整单词
问题原因
JavaScript 正则中的单词边界\b是基于\w的定义判断的,而\w仅包含大小写英文字母、数字和下划线,瑞典语的Å、Ä、Ö不属于\w的覆盖范围,会被判定为非单词字符。
你遇到的双字母单词匹配失败的核心逻辑是:单词på的最后一个字符是å(非单词字符),后面跟随的空格也属于非单词字符,两个非单词字符之间不存在\b识别的单词边界,因此\bpå\b匹配失败返回false。
而三字母单词pås的最后一个字符是s(属于\w范围的单词字符),后面跟随的空格是非单词字符,二者之间存在\b可识别的单词边界,因此匹配成功,和你的测试结果一致。
解决方案
不要使用默认的\b单词边界,改用Unicode属性转义自定义单词边界规则,匹配目标单词的前后不存在任意Unicode字母即可,同时给正则添加u标志启用Unicode支持。
改进后的代码如下:
const doesWordExist = (s, word) => { // 转义单词内的正则特殊字符,避免单词包含. * +等字符时正则逻辑异常 const escapedWord = word.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); return new RegExp(`(?<!\\p{L})${escapedWord}(?!\\p{L})`, 'iu').test(s); }; // 测试双字母瑞典语单词场景 stringOfWords = "Färg på plagg"; console.log(doesWordExist(stringOfWords, "på")) // 输出: true,符合预期 // 测试原有普通单词匹配规则 console.log(doesWordExist("banana bananarama", "banana")) // 输出: true console.log(doesWordExist("bananarama", "banana")) // 输出: false,符合独立单词匹配要求
规则说明
(?<!\\p{L}):反向否定断言,匹配当前位置的前面不是任意Unicode字母,覆盖字符串开头、空格、标点等合法的单词前置边界(?!\\p{L}):正向否定断言,匹配当前位置的后面不是任意Unicode字母,覆盖字符串结尾、空格、标点等合法的单词后置边界u标志:启用正则的Unicode支持,让\p{L}可以正确识别所有语言的字母,包括瑞典语的Å、Ä、Ö- 额外添加的特殊字符转义逻辑,可兼容带正则特殊符号的待查找单词场景。
内容的提问来源于stack exchange,提问作者Christofer Carlsson
相关产品推荐
相关产品推荐

