12

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

我有这个带有重音字符的字符串(这只是一个例子)"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”,它会按预期工作。如果您尝试匹配带有中间重音的单词,它会按预期工作。但是,如果您尝试匹配末尾带有重音的单词,则会失败。

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

4

2 回答 2

5

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

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

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

所以它适用A-Z, a-z, 0-9, and _于结尾的单词,但不适用于结尾的重音字符。

于 2011-03-15T12:33:15.300 回答
3

来自 ES3 规范:

内部辅助函数 IsWordChar 采用整数参数 e 并执行以下操作:

  1. 如果 e == –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. 返回假。

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

编辑——在 ES5 中也好不到哪里去。

于 2011-03-15T12:35:56.353 回答