JavaScript RegExp: Different results: Built pattern using string & using regexp “literal”?

前端 未结 2 877
时光取名叫无心
时光取名叫无心 2021-01-25 06:43

Is there any differences between using RegExp literals vs strings?

http://jsfiddle.net/yMMrk/

String.prototype.lastIndexOf = function(pattern) {
    patt         


        
相关标签:
2条回答
  • 2021-01-25 06:58

    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.

    0 讨论(0)
  • 2021-01-25 07:17

    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.

    0 讨论(0)
提交回复
热议问题