Javascript equivalent of Perl's \Q … \E or quotemeta()

后端 未结 3 1213
小蘑菇
小蘑菇 2020-12-05 05:29

In Perl regular expressions, you can surround a subexpression with \\Q and \\E to indicate that you want that subexpression to be matched as a lite

相关标签:
3条回答
  • 2020-12-05 05:42

    Quotemeta isn't implemented natively as far as I know, but I've used this a few months ago for just this:

    function quotemeta (str) {
      // http://kevin.vanzonneveld.net
      // +   original by: Paulo Freitas
      // *     example 1: quotemeta(". + * ? ^ ( $ )");
      // *     returns 1: '\. \+ \* \? \^ \( \$ \)'
      return (str + '').replace(/([\.\\\+\*\?\[\^\]\$\(\)])/g, '\\$1');
    }
    

    From http://phpjs.org/functions/quotemeta:496

    0 讨论(0)
  • 2020-12-05 05:51

    There's also a quotemeta npm module, which you can use in node.js or in the browser. The implementation is to quote all non-word characters, (short for [^a-zA-Z0-9_]).

    String(str).replace(/(\W)/g, '\\$1');
    

    This works because all the characters that need escaping are non-words, while the other characters that end getting escape are harmless. For example, here the percent character gets escaped, but it still matches normally in the RegExp, although it didn't need to be escaped:

    if ("Hello%".match(RegExp(String("%").replace(/(\W)/g,'\\$1')))) { console.log("matched!"); } 
    

    ```

    Someone has forked the quotemeta module and noted that the capturing parens aren't needed, so the regex can be further simplified like this:

    String(str).replace(/\W/g, '\\$&');
    
    0 讨论(0)
  • 2020-12-05 05:56

    There is no such built-in feature.

    Rather than implementing your own, I advise you look into the multitude of regex escape functions available on the internet.

    That page proposes the following solution (by Colin Snover):

    RegExp.escape = function(text) {
        return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
    }
    

    or advises to use the XRegExp library.

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