转义字符串在Javascript正则表达式中使用

可能重复:
Javascript中有RegExp.escape函数吗?

我正在尝试基于用户输入构建一个javascript正则表达式:

function FindString(input) {
    var reg = new RegExp('' + input + '');
    // [snip] perform search
}

但是,当用户输入包含一个正则表达式时,正则表达式将无法正常工作?*因为它们被解释为正则表达式特殊项。 事实上,如果用户放置一个不平衡的([在他们的字符串中,正则表达式甚至不是有效的。

什么是JavaScript函数来正确地转义所有特殊字符在正则表达式中使用?


简短甜美

function escapeRegExp(str) {
  return str.replace(/[-[]/{}()*+?.^$|]/g, "$&");
}

escapeRegExp("All of these should be escaped:  ^ $ * + ? . ( ) | { } [ ]");

>>> "All of these should be escaped:  ^ $ * + ? . ( ) | { } [ ] "

安装

在npm上作为escape-string-regexp可用

npm install --save escape-string-regexp

注意

请参阅MDN:Javascript指南:正则表达式

其他符号(〜`!@#...)可以无后果地逃脱,但不是必须的。

测试用例:一个典型的网址

escapeRegExp("/path/to/resource.html?search=query");

>>> "/path/to/resource.html?search=query"

长答案

如果你打算使用上面的函数,至少在代码的文档中链接到这个堆栈溢出文章,这样它看起来不像疯了似的难以测试的巫术。

var escapeRegExp;

(function () {
  // Referring to the table here:
  // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/regexp
  // these characters should be escaped
  //  ^ $ * + ? . ( ) | { } [ ]
  // These characters only have special meaning inside of brackets
  // they do not need to be escaped, but they MAY be escaped
  // without any adverse effects (to the best of my knowledge and casual testing)
  // : ! , = 
  // my test "~!@#$%^&*(){}[]`/=?+|-_;:'",<.>".match(/[#]/g)

  var specials = [
        // order matters for these
          "-"
        , "["
        , "]"
        // order doesn't matter for any of these
        , "/"
        , "{"
        , "}"
        , "("
        , ")"
        , "*"
        , "+"
        , "?"
        , "."
        , ""
        , "^"
        , "$"
        , "|"
      ]

      // I choose to escape every character with ''
      // even though only some strictly require it when inside of []
    , regex = RegExp('[' + specials.join('') + ']', 'g')
    ;

  escapeRegExp = function (str) {
    return str.replace(regex, "$&");
  };

  // test escapeRegExp("/path/to/res?search=this.that")
}());
链接地址: http://www.djcxy.com/p/76813.html

上一篇: Escape string for use in Javascript regex

下一篇: modify a regex so that only [a