Jiew Meng
Jiew Meng

Reputation: 88207

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\nHello 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/

Upvotes: 1

Views: 2018

Answers (2)

Tim Pietzcker
Tim Pietzcker

Reputation: 336208

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.

Upvotes: 2

Nick Craver
Nick Craver

Reputation: 630449

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.

Upvotes: 6

Related Questions