【问题标题】:Escape string for use in Javascript regex [duplicate]用于 Javascript 正则表达式的转义字符串 [重复]
【发布时间】:2011-03-27 15:31:15
【问题描述】:

可能重复:
Is there a RegExp.escape function in Javascript?

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

函数查找字符串(输入){ var reg = new RegExp('' + 输入 + ''); // [snip] 执行搜索 }

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

正确转义所有特殊字符以用于正则表达式的 javascript 函数是什么?

【问题讨论】:

标签: javascript regex escaping


【解决方案1】:

Short 'n Sweet(2021 年更新)

转义正则表达式本身:

function escapeRegExp(string) {
    return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
}

转义替换字符串:

function escapeReplacement(string) {
    return string.replace(/\$/g, '$$$$');
}

示例

所有转义的正则表达式字符:

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

查找和替换字符串:

var haystack = "I love $x!";

var needle = "$x";
var safeNeedle = escapeRegExp(needle); // "\\$x"

var replacement = "$100 bills"
var safeReplacement = escapeReplacement(replacement); // "$$100 bills"

haystack.replace(
  new RegExp(safeNeedle, 'g'),
  escapeReplacement(safeReplacement),
);
// "I love $100 bills!"

(注意:以上不是原始答案;它经过编辑以显示one from MDN。这意味着它确实与您在下面的 npm 中的代码,并且 not 与下面的长答案中显示的匹配。cmets 现在也很混乱。我的建议:使用上面的,或者从 MDN 获取它,而忽略其余的这个答案。-Darren,2019 年 11 月)

安装

在 npm 上可用 escape-string-regexp

npm install --save escape-string-regexp

注意

MDN: Javascript Guide: Regular Expressions

其他符号 (~`!@# ...) 可以转义而不会产生任何后果,但不是必须的。

.

.

.

.

测试用例:一个典型的url

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")
}());

【讨论】:

  • 哇,这太冗长了。我更喜欢bobince's version。但是任何可以在没有不必要地逃避事情的情况下工作的东西......
  • 为什么要换成'\\$&'。这是什么意思?不好意思,我是JS新手。
  • @SushantGupta "\\" 添加了新的反斜杠,用于转义匹配的特殊正则表达式字符。 "$&" 是对当前模式匹配内容的反向引用,添加了原始的特殊正则表达式字符。
  • 这些字符中的大多数不需要在字符类中进行转义。破折号和正斜杠根本不需要转义。因此,这可以简化为: return str.replace(/[[{}()*+?^$|\]\.\\]/g, "\\$&");
  • 2016年有没有更理智的方式?
猜你喜欢
  • 2011-06-23
  • 1970-01-01
  • 2012-12-14
  • 1970-01-01
  • 2011-10-13
  • 1970-01-01
  • 2010-09-21
相关资源
最近更新 更多