2011-11-01 14 views
17

Recientemente tuvimos un error, después de que un desarrollador compañero cambió un literal de RegExp en una llamada de constructor, y me preguntaba por qué hay alguna diferencia. el código exacto eraDiferencias entre Javascript regexp literal y constructor

var parts = new RegExp("/rt:([^@]+)@(\d+)/").exec(tag); 

vs el original de

var parts = /rt:([^@]+)@(\d+)/.exec(tag); 

Cuando tag decir, por ejemplo rt:[email protected], la primera (con errores) llamada devuelve null, mientras que el segundo uno vuelve ["rt:[email protected]", "60C1C036-42FA-4073-B10B-1969BD2358FB", "00000000077"]

Huelga decir que revertí el cambio, pero me gustaría saber por qué hay tanta diferencia en primer lugar.

Respuesta

33

Hay dos problemas:

El / son no parte de la expresión. Son delimitadores, marcando un literal de expresión regular. Deben eliminarse si usa RegExp, de lo contrario, coinciden con una barra literal.

En segundo lugar, la barra diagonal inversa es el carácter de escape en los literales de cadena. Para crear un literal \ para la expresión, debe escaparse en la cadena.

Por lo tanto, el equivalente sería:

new RegExp("rt:([^@]+)@(\\d+)") 

Especialmente el escape hace que la expresión un poco más difícil de escribir si desea utilizar RegExp. En realidad, solo es necesario si desea crear una expresión de forma dinámica, es decir, si desea incluir texto almacenado en una variable, por ejemplo. Si tiene una expresión fija, un literal /.../ es más fácil de escribir y más conciso.

+0

¡Buena respuesta, creo que eliminaré la mía! ¿Qué sucede si necesita reutilizar un RegExp en particular? ¿No es un buen momento para usar un constructor? ¿O simplemente diría 'var resuasableRegex =/.. pattern ../;'? –

+0

@ElRonnoco: Exactamente, también puede asignar un literal de expresión regular a una variable. –

+0

Gracias por la información. La próxima vez investigaré mejor las cuerdas para asegurarme de que no haya caracteres de escape necesarios. De todos modos, literal es mucho más fácil. –

4

\d debe escaparse cuando se pasa al constructor new RegExp. Por lo tanto, tiene que ser

var parts = new RegExp("rt:([^@]+)@(\\d+)").exec(tag); 
Cuestiones relacionadas