2011-03-15 55 views
11

我遇到了很多简单的正则表达式匹配问题。Javascript正则表达式问题与 b和国际字符

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

这是我的代码的简化版本。例如,为达到“Botó

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

如果我运行它,它不匹配“Botó”预期(火狐,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”,它会按预期工作。 如果您尝试在中间匹配带重音符的单词,它会按预期工作。 但如果您尝试在最后匹配带有口音的单词,则会失败。

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

回答

5

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

看看这个问题的答案:Javascript + Unicode。这篇文章,在这个问题,JavaScript, Regex, and Unicode联说,\b由一个单词边界,它被定义为定义:

→字字符 - 字符A-Z, A-Z,0-9只,和_。
→单词边界 - 单词字符 与非单词字符之间的位置。

因此,它将适用于末尾为A-Z, a-z, 0-9, and _的单词,但末尾没有重音字符。

+0

*因此,它将适用于末尾有重音符的单词,但不会在末尾带有重音符号。 – 2011-03-15 12:42:34

+0

我认为你的最后一句话需要一点帮助... – Pointy 2011-03-15 12:42:41

+0

@Felix @Pointy谢谢,修正了 – 2011-03-15 12:48:19

3

从ES3规格:

内部辅助函数IsWordChar需要一个整数参数e,并且执行以下操作:

  1. 如果使用电子== -1或E == InputLength,返回false。
  2. 设c为字符Input [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。

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

编辑 —它在ES5中没有更好的。