2011-07-21 8 views
7

¿El siguiente código es válido?¿Es " /" válido dentro de una javascript regex?

function test() { 
    return /\//.exec("\/"); 
} 
alert(test()); 

Parece que muchos minifiers javascript (incluyendo jsmin en http://jscompress.com/) consideran el "//" en la segunda línea a ser el comienzo de un comentario. Supongo que es un error en los minificadores implementados "trivialmente", ya que todas las implementaciones de navegador que intenté ejecutar sin ningún problema. Try it on jsfiddle.

+3

Es por eso que algunos motores de expresiones regulares le permiten especificar diferentes delimitadores ... – BoltClock

+0

Me pregunto cómo la especificación indica que esto no inicia un comentario. – pimvdb

+1

Probablemente de la misma manera 'var q =" // ";' es válido. –

Respuesta

3

que estaba interesado en mirar hacia arriba en las especificaciones, y de acuerdo con lo que es válido:

RegularExpressionLiteral :: 
    /RegularExpressionBody/RegularExpressionFlags 
RegularExpressionBody :: 
    RegularExpressionFirstChar RegularExpressionChars 
RegularExpressionChars :: 
    [empty] 
    RegularExpressionChars RegularExpressionChar 
RegularExpressionFirstChar :: 
    RegularExpressionNonTerminator but not * or \ or/or [ 
    RegularExpressionBackslashSequence 
    RegularExpressionClass 
RegularExpressionChar :: 
    RegularExpressionNonTerminator but not \ or/or [ 
    RegularExpressionBackslashSequence 
    RegularExpressionClass 
RegularExpressionBackslashSequence :: 
    \ RegularExpressionNonTerminator 
RegularExpressionNonTerminator :: 
    SourceCharacter but not LineTerminator 

la \/ se considera a RegularExpressionBackslashSequence, y por lo tanto es parte de RegularExpressionBody, y como resultado no puede formar parte del marcador de comentario //.

3

Sí, eso es javascript válido :) Eso es un error en el minificador, y probablemente debería ser reparado. Se podría conseguir alrededor de él si quería al hacer que su expresión regular tienen algo estúpido al final de la misma gustaría:

return /\/(?:.|$)/.exec("\/"); 

que dice básicamente, ya sea al final de la cadena, o no al final de la cadena, sin capturar . Pero no creo que sea una buena solución y yo no la usaría jaja.

+4

Mejor: 'return new RegExp ("/") exec ("\ /");' – BoltClock

+0

Ah, por supuesto.! jaja – Paulpro

+1

@PaulPRO '|. $' no coincide con una nueva línea, así que no es un equivalente a la expresión regular originales. – Karolis

3

Sí, esto es legal. \/ coincide con un literal /. El primer \ escapa al /. La línea:

/\//.exec("\/"); 

se evalúa como:

["/"] 
+0

Como se demostró en el violín :) – BoltClock

Cuestiones relacionadas