JavaScript RegExp: Different results: Built pattern using string & using regexp "literal"?
Is there any differences between using RegExp literals vs strings?
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\n开发者_如何学PythonHello 3\nHello4";
alert(str.lastIndexOf("(\r?\n)")); // always returns the 1st newline (7)
alert(indexOfLastNewline(str)); // returns correctly (23)
Update
even if I use a RegExp
object, I still get the same result
http://jsfiddle.net/yMMrk/2/
You need to escape your \
in the string version as \\
, like this:
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)
You can test it out here.
Generally speaking, if you use a string to construct a regex, you need to escape backslashes; if you use a regex literal, you need to escape slashes if they occur in your regex.
So the regex
\s/
can be written as a JavaScript string like this:
"\\s/"
and as a JavaScript regex literal like this:
/\s\//
Also, there is a difference in the handling of mode modifiers. For example, to make a regex case-insensitive, you can construct a regex object from a JavaScript string like this:
var myre = new RegExp("[a-z]", "i");
With a regex literal, you can do that directly:
var myre = /[a-z]/i;
Also, see this tutorial.
精彩评论