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

时间:2011-03-15 12:20:30

标签: 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);

如果我运行它,它与“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”,它会按预期工作。 如果您尝试在中间匹配带重音的单词,它会按预期工作。 但如果你尝试在最后匹配带有重音的单词,它就会失败。

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

2 个答案:

答案 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并执行以下操作:

  1. 如果e == -1或e == InputLength,则返回false。
  2. 设c为字符输入[e]。
  3. 如果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 _
    
  4. 返回false。

  5. “IsWordChar()”内部(可能是假设的)函数是“\ b”断言行为的基础。

    编辑 - 在ES5中没有比这更好的了。