2012-06-01 20 views
18

[^a] significa cualquier carácter que no sea a, lo sabemos, pero ¿qué significa [^] (sin los siguientes caracteres)? Así como - pierde su significado del rango de caracteres en casos como [-], supuse que [^] coincidiría con el símbolo de intercalación. Pasé demasiado tiempo depurando este problema, solo para descubrir que al menos en Chrome 19 parece coincidir con cualquier cosa, en otras palabras, ser equivalente a .. ¿Hay alguna especificación aplicable aquí o cuál es el comportamiento esperado?¿Qué significa [^] en expresiones regulares de Javascript?

Sí, soy consciente de que puedo y probablemente debería utilizar [\^]. Esta pregunta está más en la naturaleza de la curiosidad morbosa.

+0

Hmm. Niega el conjunto, pero si el conjunto está vacío ... ¿Coincide con algo siempre que no sea nada? Eso no parece correcto. ¿Qué hace [] coincidir? [^] debe coincidir con cualquier cosa que [] no coincida. – Okonomiyaki3000

+0

Basado en las respuestas a continuación, ¡parece que significa que "esta expresión no debe usarse"! – jahroy

+2

Prueba de rendimiento relacionada: http://jsperf.com/match-any-char-regex –

Respuesta

30

De acuerdo con la especificación JavaScript (ES3 y ES5), [^] coincide con cualquier unidad de un solo código, el mismo que [\s\S], [\0-\uffff], (.|\s) (no usar eso, a diferencia de los otros, que se basa en dar marcha atrás), etc. El la diferencia de . es que el punto no coincide con los cuatro puntos del código de nueva línea (\r, \n, \u2028 y \u2029).

No recomiendo usar [^] o [], porque no funcionan consistentemente entre navegadores, y evitan que sus expresiones regulares trabajen en otros lenguajes de programación. IE < = 8 y versiones anteriores de Safari usan el comportamiento regex tradicional (sin JavaScript) para las clases de caracteres vacías.Las versiones anteriores de Opera invierten el comportamiento correcto de JavaScript, por lo que [] coincide con cualquier unidad de código y [^] nunca coincide. El comportamiento tradicional de expresiones regulares es que un ] líder sin enclaustrar dentro de una clase de caracteres se trata como un carácter literal y no finaliza la clase de caracteres.

Si utiliza la biblioteca XRegExp, [] y [^] funcionan de manera correcta y sistemática entre navegadores. XRegExp también agrega el indicador s (también conocido como dotall o singleline) que hace que un punto coincida con cualquier unidad de código (lo mismo que [^] en un navegador que sigue correctamente las especificaciones de JavaScript).

+0

¡Excelente publicación! ¿Podría ser más específico sobre las versiones antiguas de Safari y Opera? –

+2

Gracias. No estoy seguro de qué versiones solucionaron los problemas. Sé que Safari 3 lo entendió mal. (Early v3 Safari tenía muchas sorpresas RegExp poco conocidas ya que estaba ejecutando PCRE con una capa JS demasiado simple encima). Opera aún se estaba equivocando cuando escribí por primera vez http://xregexp.com/cross_browser/ . Probablemente lo arreglaron poco después de que se lanzara Acid3, ya que Acid3 prueba explícitamente las clases de caracteres vacías (para mi consternación, ya que hasta que salió eso esperaba que ES pudiera cambiar para que coincidiera con el comportamiento tradicional). Parece que IE realmente no solucionó el problema hasta v9 (he editado mi publicación). – slevithan

1

El significado es la negación de lo que sigue. Nada sigue aquí, por lo tanto:

nada más que nada = todo lo

Sin embargo, la mayoría de los otros motores de RegEx Lanza un error en la expresión embargo:

  • ereg(): REG_EBRACK
  • preg_match(): Compilation failed: missing terminating ]
2

El cursor ^ tiene muchos significados, como con la mayoría de los caracteres en la sintaxis de expresiones regulares. Además, todos los personajes dependen en gran medida de su contexto. Para complicar aún más las cosas, algunos caracteres y la sintaxis dependen del motor subyacente (Perl, Java).

Vamos a romper aparte [^]:

[] es una clase de caracteres.

[^ es el: Negación

de la clase de caracteres, igualando un personaje que no figura en la clase de caracteres.

Se hicieron no definen los caracteres de la clase de caracteres. Entonces el comportamiento es undefined. Lo que significa que hay nada para negar y, por lo tanto, coincide cualquier cosa.

+0

Entonces, ¿por qué no acaba de hacer '.' –

+1

@Derek Porque' .' no coincide con los caracteres de nueva línea. –

+0

'Entonces el comportamiento no está definido. Esto podría llevar a las personas a creer que es un comportamiento indefinido, lo cual no es cierto, ya que está definido en las especificaciones de ECMA, aunque la implementación varía. – nhahtdh

Cuestiones relacionadas