JavaScript正则中\b匹配西里尔字符失效的原因及解决办法
问题原因
(*UCP)是PCRE(Perl兼容正则表达式)引擎专属的语法标记,作用是开启Unicode字符属性支持,将非ASCII字母纳入单词字符判定范围。JavaScript正则基于ECMAScript标准实现,原生不支持PCRE的这类特殊标记,直接写入正则表达式会直接抛出语法错误。- 即使移除
(*UCP)标记,JavaScript原生的\b单词边界默认仅识别ASCII范围内的单词字符([a-zA-Z0-9_]),西里尔字母不属于默认单词字符范畴,因此\bпроверка\b无法正确匹配西里尔文本中的单词边界。
解决方法
JavaScript ES2018及以上版本支持u修饰符和Unicode属性转义,可以通过否定前后断言模拟支持多语言的单词边界,替代PCRE的(*UCP)+\b方案,示例代码如下:
// u修饰符开启Unicode正则模式,前后断言模拟多语言单词边界 const regex = /(?<![\p{Letter}\p{Mark}])проверка(?![\p{Letter}\p{Mark}])/u; console.log(regex.test('а проверка б')); // 输出 true
如果需要匹配包含目标单词的整行内容,可在正则首尾补全任意字符匹配规则:
const regex = /^.*(?<![\p{Letter}\p{Mark}])проверка(?![\p{Letter}\p{Mark}]).*$/u; console.log(regex.test('а проверка б')); // 输出 true
\p{Letter}匹配任意语言的字母字符,\p{Mark}匹配各类变音符号,前后的否定断言即可实现和PCRE下(*UCP)\b一致的单词边界匹配效果。
内容的提问来源于stack exchange,提问作者jsNewbie
相关产品推荐
相关产品推荐

