2011-03-15 27 views
11

Tengo muchos problemas con una simple coincidencia de expresiones regulares.Problema de expresión regular de Javascript con by caracteres internacionales

Tengo esta cadena con caracteres acentuados (esto es solo un ejemplo) "Botó Entrepà Nadó Facebook! " y quiero unir palabras usando palabras de otra lista.

Esta es una versión simplificada de mi código. Por ejemplo, para que coincida con "Botó"

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

Si lo ejecuto, que no coincide con "Botó" como se esperaba (Firefox, IE y Chrome).

Pensé que era un error de mi parte. Pero aquí viene la diversión ...

Si modifico la cadena como esta "Botón Entrepà Nadó Facebook! " (nótese la "n" después de "Botó ') y corro el mismo código:

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

Coincide con' Botó" !!!! ????? (al menos en Firefox). Esto no tiene sentido para mí ya que "n" NO es un límite de palabra (que coincide con \b).

Si intenta hacer coincidir la palabra completa:

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

Funciona.

Para hacerlo un poco más extraño, agregamos otra letra acentuada al final.

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

Si intentamos hacer coincidir esto, no coincide con nada. PERO, si tratamos este

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

coincide "Botóñ". Cuál está mal.

Si tratamos de hacer coincidir "Facebook", funciona como se esperaba. Si intenta hacer coincidir palabras con acentos en el medio, funciona como se esperaba. Pero si intenta hacer coincidir las palabras con un acento al final, falla.

¿Qué estoy haciendo mal? Es este el comportamiento esperado?

Respuesta

5

Desafortunadamente, las clases de caracteres taquigráficos en Javascript no admiten Unicode (o incluso alto ASCII).

Eche un vistazo a las respuestas a esta pregunta: Javascript + Unicode. En este artículo, vinculado en esa pregunta, JavaScript, Regex, and Unicode, dice que \b está definido por un límite de palabra, que se define como:

→ Predictivo - Los caracteres A-Z, a-z, 0-9 y _ solamente.
→ Límite de palabra: la posición entre un carácter de palabra y carácter no de palabra.

Así que funcionará para las palabras con A-Z, a-z, 0-9, and _ al final, pero no con los caracteres acentuados al final.

+0

* Así que funcionará para las palabras con acentos al final, pero no con acentos al final. *? –

+0

Creo que su última oración necesita un poco de ayuda ... – Pointy

+0

@Felix @Pointy gracias, corregido –

3

De la especificación ES3:

El IsWordChar función auxiliar interna toma un parámetro entero e y realiza lo siguiente:

  1. Si e == -1 o e == InputLength, falso retorno.
  2. Sea c el carácter Entrada [e].
  3. Si c es uno de los sesenta y tres caracteres de la tabla siguiente, devuelve 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. Devolver falso.

La función "IsWordChar()" interna (posiblemente hipotético) es la base de comportamiento para la afirmación "\ b".

editar — no es mejor en ES5.

Cuestiones relacionadas