2010-05-21 9 views
19

En JavaScript:UTF-8 palabra expresiones regulares límite en javascript

"ab abc cab ab ab".replace(/\bab\b/g, "AB"); 

me da correctamente:

"AB abc cab AB AB" 

Cuando uso caracteres UTF-8 sin embargo:

"αβ αβγ γαβ αβ αβ".replace(/\bαβ\b/g, "AB"); 

la word boundary operator no parece funcionar:

"αβ αβγ γαβ αβ αβ" 

¿Hay una solución a esto?

+1

JavaScript no utiliza 'UTF-8' para Unicode. Según el estándar, una implementación puede usar 'UCS-2' o' UTF-16', creo. Esto significa que está operando en texto que se ha convertido a uno de estos formatos, o podría estar operando en un texto donde cada "octeto" (byte) de cada punto de código Unicode se ha convertido a uno de estos formatos, dependiendo de cómo se el código recibe el texto. – hippietrail

Respuesta

22

La afirmación de límite de palabras solo coincide si un carácter de palabra no va precedido o seguido de otro carácter de palabra (por lo que .\b. es igual a \W\w y \w\W). Y \w se define como [A-Za-z0-9_]. Entonces, \w no coincide con los caracteres griegos. Y por lo tanto no puede usar \b para este caso.

Lo que podría hacer es en vez de usar esto:

"αβ αβγ γαβ αβ αβ".replace(/(^|\s)αβ(?=\s|$)/g, "$1AB") 
+0

gracias. El uso de la notación de anticipación (? = ...) parece interesante también. ¿Podría hacerse esto sin eso? – cherouvim

+3

@cherouvim: No, consumiría el espacio después de la palabra que es entonces el inicio para la siguiente búsqueda.Entonces, simplemente mirando '" αβ αβ "', la primera coincidencia consumiría '" αβ | αβ "' ('|' indica el puntero interno) y la última parte no coincidiría porque no queda espacio libre. Pero dado que la afirmación de anticipación no consume caracteres, la posición del puntero después del primer partido será '" αβ | αβ "' y el espacio inicial se conserva para el próximo partido. – Gumbo

+1

Esto no es lo mismo que un límite de palabras. No coincide con 'αβ!' Por ejemplo. –

1

No todas las implementaciones de expresiones regulares asociados con los motores de Javascript Unicode consciente.

Por ejemplo, Microsofts JScript en IE está limitado a ANSI.

2

No toda aplicación expresión regular Javascript tiene soporte para Unicode anuncio por lo que necesita para escapar de ella

"αβ αβγ γαβ αβ αβ".replace(/\u03b1\u03b2/g, "AB"); // "AB ABγ γAB AB AB" 

para el mapeo de los caracteres que se pueden echar un vistazo a http://htmlhelp.com/reference/html40/entities/symbols.html

Por supuesto, esto no ayuda con el problema del límite de palabras (como se explica en otras respuestas), pero al menos debería permitir que coincida con los caracteres correctamente

+0

¿Entonces por qué no usa los mismos escapes Unicode para la cadena también? – Gumbo

+0

Porque uno se analiza como una cadena, y uno como un RegExp literal - No estoy seguro si importa aunque ... –

+3

Pero si la implementación de expresión regular no admite Unicode, ¿cómo es una secuencia de escape Unicode como '\ u03b1' se supone que debe ser interpretado? – Gumbo

1

Cuando se trata de palabras Unicode y de lenguaje natural, es probable que desee tener más cuidado w ith límites que simplemente usar \b. Consulte this answer para obtener detalles e instrucciones.

2

que necesitaba algo para ser programable y manejar puntuacion, soportes, etc.

http://jsfiddle.net/AQvyd/

var wordToReplace = '買い手', 
    replacementWord = '[[BUYER]]', 
    text = 'Mange 買い手 information. The selected Store and Classification will be the default on the สั่งซื้อ.' 

function replaceWord(text, wordToReplace, replacementWord) { 
    var re = new RegExp('(^|\\s|\\(|\'|"|,|;)' + wordToReplace + '($|\\s|\\)|\\.|\'|"|!|,|;|\\?)', 'gi'); 
    return text.replace(re, replacementWord); 
} 

He escrito un editor de recursos javascript por lo que esta es la razón por lo que he encontrado esta página y también respondí por necesidad ya que no pude encontrar una palabra equivalente parametrada que funcionara bien para Unicode.

+0

En realidad, debería estar escapando de "wordToReplace" con "\" en caracteres reservados. Tendré que actualizar eso. –

Cuestiones relacionadas