JavaScript RegExp: diferentes resultados: ¿Patrón construido usando una cadena y usando expresiones regulares “literal”?

¿Hay alguna diferencia entre el uso de RegExp literals vs cadenas?

http://jsfiddle.net/yMMrk/

String.prototype.lastIndexOf = function(pattern) { pattern = pattern + "(?![\s\S]*" + pattern + ")"; var match = this.match(pattern); return (match == null) ? -1 : match.index; } function indexOfLastNewline(str) { var match = str.match(/\r?\n(?![\s\S]*(\r?\n))/); return (match == null) ? -1 : match.index; } var str = "Hello 1\nHello 2\nHello 3\nHello4"; alert(str.lastIndexOf("(\r?\n)")); // always returns the 1st newline (7) alert(indexOfLastNewline(str)); // returns correctly (23) 

Actualizar

incluso si uso un objeto RegExp , sigo obteniendo el mismo resultado

http://jsfiddle.net/yMMrk/2/

Debes escapar de tu \ en la versión de cadena como \\ , así:

 String.prototype.lastIndexOf = function(pattern) { pattern = pattern + "(?![\\s\\S]*" + pattern + ")"; var match = this.match(pattern); return (match == null) ? -1 : match.index; } function indexOfLastNewline(str) { var match = str.match(/\r?\n(?![\s\S]*(\r?\n))/); return (match == null) ? -1 : match.index; } var str = "Hello 1\nHello 2\nHello 3\nHello4"; alert(str.lastIndexOf("(\\r?\\n)")); // returns correctly (23) alert(indexOfLastNewline(str)); // returns correctly (23) 

Puedes probarlo aquí .

En general, si usa una cadena para construir una expresión regular, necesita escapar de barras invertidas; Si usa un literal de expresiones regulares, debe evitar las barras inclinadas si se producen en su expresión regular.

Así que la expresión regular

 \s/ 

se puede escribir como una cadena de JavaScript como esta:

 "\\s/" 

y como un literal de expresiones regulares de JavaScript como este:

 /\s\// 

Además, hay una diferencia en el manejo de modificadores de modo. Por ejemplo, para hacer que un regex no distinga entre mayúsculas y minúsculas, puede construir un objeto regex a partir de una cadena de JavaScript como esta:

 var myre = new RegExp("[az]", "i"); 

Con un literal regex, puedes hacer eso directamente:

 var myre = /[az]/i; 

También, vea este tutorial .