使用\ b和国际字符的Javascript正则表达式问题

JLP*_*JLP 12 javascript regex match non-ascii-characters

我在简单的正则表达式匹配方面遇到了很多问题.

我有这个带有重音字符的字符串(这只是一个例子)"Botó Entrepà Nadó Facebook! "我希望使用另一个列表中的单词来匹配单词.

这是我的代码的简化版本.例如匹配" Botó"

var matchExpr = new RegExp ('\\b' + 'Botó' + '\\b','i'); 
"Botó Entrepà Nadó Facebook! ".match(matchExpr);
Run Code Online (Sandbox Code Playgroud)

如果我运行它,它与Botó预期不匹配(Firefox,IE和Chrome).

我认为这是我的错误.但有趣的是......

如果我像这样修改字符串"Botón Entrepà Nadó Facebook! "(请注意" n"之后的" Botó")并运行相同的代码:

var matchExpr = new RegExp ('\\b' + 'Botó' + '\\b','i'); 
"Botón Entrepà Nadó Facebook! ".match(matchExpr);
Run Code Online (Sandbox Code Playgroud)

它匹配" Botó"!!!! ????? (至少在Firefox中).这对我n来说没有意义,因为" "不是一个单词边界(匹配\b).

如果您尝试匹配整个单词:

var matchExpr = new RegExp ('\\b' + 'Botón' + '\\b','i'); 
"Botón Entrepà Nadó Facebook! ".match(matchExpr);
Run Code Online (Sandbox Code Playgroud)

有用.

为了使它更奇怪,我们在最后添加另一个带重音的字母.

var matchExpr = new RegExp ('\\b' + 'Botóñ' + '\\b','i'); 
"Botóñ Entrepà Nadó Facebook! ".match(matchExpr);
Run Code Online (Sandbox Code Playgroud)

如果我们尝试匹配它,它什么都不匹配.但是,如果我们试试这个

var matchExpr = new RegExp ('\\b' + 'Botóñ' + '\\b','i'); 
"Botóña Entrepà Nadó Facebook! ".match(matchExpr);
Run Code Online (Sandbox Code Playgroud)

它匹配" Botóñ".哪个错了.

如果我们尝试匹配"Facebook",它按预期工作.如果您尝试在中间匹配带重音的单词,它会按预期工作.但是如果你尝试在最后匹配带有重音的单词,它就会失败.

我究竟做错了什么?这是预期的行为吗?

Dav*_*ton 5

不幸的是,Javascript中的速记字符类不支持unicode(甚至高ASCII).

看看这个问题的答案:Javascript + Unicode.本文与该问题相关联,JavaScript,Regex和Unicode,表示\b由字边界定义,字边界定义为:

→单词字符 - 仅限字符AZ,az,0-9和_.
→单词边界 - 单词字符和非单词字符之间的位置.

所以它最终会用于单词A-Z, a-z, 0-9, and _,但最后不会带有重音字符.