JavaScript, expresiones regulares y Unicode

No todas las clases de caracteres abreviados y otras sintaxis de expresiones regulares de JavaScript son compatibles con Unicode. En algunos casos, puede ser importante saber exactamente qué tokens coinciden, y eso es lo que explorará esta publicación.

Según ECMA-262 3.ª edición, \s , \S , . , ^ y $ usar interpretaciones basadas en Unicode de espacios en blanco y nueva línea , mientras que \d , \D , \w , \W , \b y \B usar interpretaciones solo ASCII de dígito , carácter de palabra y límite de palabra (por ejemplo, /a\b/.test("naïve") devuelve true ). Las implementaciones reales del navegador a menudo difieren en estos puntos. Por ejemplo, Firefox 2 considera \d y \D para ser compatible con Unicode, mientras que Firefox 3 corrige este error, haciendo que \d equivalente a [0-9] como con la mayoría de los otros navegadores.

Aquí nuevamente están los tokens afectados, junto con sus definiciones:

  • \d — Dígitos.
  • \s — Espacio en blanco.
  • \w — Caracteres de palabras.
  • \D — Todo excepto los dígitos.
  • \S — Todo excepto los espacios en blanco.
  • \W — Todos excepto los caracteres de palabra.
  • . — Todo excepto saltos de línea.
  • ^ (con /m ) — Las posiciones al comienzo de la cadena y justo después de las líneas nuevas.
  • $ (con /m ) — Las posiciones al final de la cadena y justo antes de las líneas nuevas.
  • \b — Posiciones de límite de palabra.
  • \B — No posiciones de límites de palabras.

Todo lo anterior es estándar en los sabores de expresiones regulares derivados de Perl. Sin embargo, el significado de los términos dígito , espacio en blanco , carácter de palabra , límite de palabra y nueva línea depende del tipo de expresión regular, el conjunto de caracteres y la plataforma que esté utilizando, por lo que estos son los significados oficiales de JavaScript que se aplican a las expresiones regulares:

  • Dígito — Solo los caracteres 0-9.
  • Espacio en blanco — Tabulador, salto de línea, tabulador vertical, salto de página, retorno de carro, espacio, espacio sin interrupción, separador de línea, separador de párrafo y "cualquier otro 'separador de espacio' Unicode".
  • Carácter de la palabra — Solo los caracteres A-Z, a-z, 0-9 y _.
  • Límite de palabras — La posición entre un carácter de palabra y no carácter de palabra .
  • Nueva línea — Los caracteres de avance de línea, retorno de carro, separador de línea y separador de párrafo.

Aquí nuevamente están los caracteres de nueva línea, con sus códigos de carácter:

  • \u000a — Salto de línea — \n
  • \u000d — Retorno de carro — \r
  • \u2028 — Separador de línea
  • \u2029 — Separador de párrafos

Tenga en cuenta que las propuestas de ECMAScript 4 indican que el carácter de control de "siguiente línea" C1/Unicode NEL (\u0085 ) se reconocerá como un carácter de nueva línea adicional en ese estándar. También tenga en cuenta que aunque CRLF (un retorno de carro seguido de un avance de línea) se trata como una sola secuencia de nueva línea en la mayoría de los contextos, /\r^$\n/m.test("\r\n") devuelve true .

En cuanto a los espacios en blanco, ECMA-262 3rd Edition utiliza una interpretación basada en el plano multilingüe básico de Unicode, de la versión 2.1 o posterior del estándar Unicode. Los siguientes son los caracteres que deben coincidir con \s según ECMA-262 3.ª edición y Unicode 5.1:

  • \u0009 — Pestaña — \t
  • \u000a — Salto de línea — \n — (carácter de nueva línea)
  • \u000b — Pestaña vertical — \v
  • \u000c — Feed de formulario — \f
  • \u000d — Retorno de carro — \r — (carácter de nueva línea)
  • \u0020 — Espacio
  • \u00a0 — Espacio sin descanso
  • \u1680 — Marca de espacio Ogham
  • \u180e — Separador de vocales mongol
  • \u2000 — En quad
  • \u2001 — Em quad
  • \u2002 — En el espacio
  • \u2003 — Em espacio
  • \u2004 — Espacio de tres por em
  • \u2005 — Espacio de cuatro por em
  • \u2006 — Espacio de seis por em
  • \u2007 — Espacio de figuras
  • \u2008 — Espacio de puntuación
  • \u2009 — Espacio delgado
  • \u200a — Espacio para el cabello
  • \u2028 — Separador de línea — (carácter de nueva línea)
  • \u2029 — Separador de párrafo — (carácter de nueva línea)
  • \u202f — Espacio estrecho sin interrupciones
  • \u205f — Espacio matemático medio
  • \u3000 — Espacio ideográfico

Para probar qué caracteres o posiciones coinciden con todos los tokens mencionados aquí en su navegador, consulte Pruebas Unicode y expresiones regulares de JavaScript . Tenga en cuenta que Firefox 2.0.0.11, IE 7 y Safari 3.0.3 beta se equivocan en algunas de las pruebas.

Actualización: Mi nuevo complemento Unicode para XRegExp le permite hacer coincidir fácilmente categorías, secuencias de comandos y bloques de Unicode en expresiones regulares de JavaScript.