我在简单的正则表达式匹配方面遇到了很多问题。
我的这个字符串带有重音字符(这只是一个例子)"Botó Entrepà Nadó Facebook! "
我希望使用其他列表中的单词匹配单词。
这是我的代码的简化版本。例如,匹配“Botó
”
var matchExpr = new RegExp ('\\b' + 'Botó' + '\\b','i');
"Botó Entrepà Nadó Facebook! ".match(matchExpr);
如果我运行它,它与“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);
匹配“Botó
”!!!! ????? (至少在Firefox中)。
这对我来说没有意义,因为“n
”不是单词边界(由\b
匹配)。
如果您尝试匹配整个单词:
var matchExpr = new RegExp ('\\b' + 'Botón' + '\\b','i');
"Botón Entrepà Nadó Facebook! ".match(matchExpr);
有效。
为了使它更奇怪,我们在最后添加另一个带重音的字母。
var matchExpr = new RegExp ('\\b' + 'Botóñ' + '\\b','i');
"Botóñ Entrepà Nadó Facebook! ".match(matchExpr);
如果我们尝试匹配这个,它什么都不匹配。但是,如果我们尝试这个
var matchExpr = new RegExp ('\\b' + 'Botóñ' + '\\b','i');
"Botóña Entrepà Nadó Facebook! ".match(matchExpr);
匹配“Botóñ
”。这是错的。
如果我们尝试匹配“Facebook”,它会按预期工作。 如果您尝试在中间匹配带重音的单词,它会按预期工作。 但如果你尝试在最后匹配带有重音的单词,它就会失败。
我做错了什么?这是预期的行为吗?
答案 0 :(得分:5)
不幸的是,Javascript中的速记字符类不支持unicode(甚至高ASCII)。
看看这个问题的答案:Javascript + Unicode。本文与该问题JavaScript, Regex, and Unicode相关联,表示\b
由字边界定义,其定义为:
→单词字符 - 字符A-Z, 仅限a-z,0-9和_ →单词边界 - 单词字符之间的位置 和非单词字符。
因此它适用于最后带有A-Z, a-z, 0-9, and _
的单词,但最后不会带有重音字符。
答案 1 :(得分:3)
从ES3规范:
内部帮助函数IsWordChar采用整数参数e并执行以下操作:
如果c是下表中的63个字符之一,则返回true。
a b c d e f g h i j k l m n o p q r s t u v w x y z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
0 1 2 3 4 5 6 7 8 9 _
返回false。
“IsWordChar()”内部(可能是假设的)函数是“\ b”断言行为的基础。
编辑 - 在ES5中没有比这更好的了。