如何正确转义正则表达式中的字符

时间:2011-04-14 13:27:37

标签: javascript regex escaping

我想在字符串中进行字符串搜索。只需说MySTR.search(Needle)

当此needle字符串包含特殊的正则表达式字符(如*,+等)时,会出现此问题。它失败并显示错误invalid quantifier

我浏览了网页,发现该字符串可以使用\Q some string \E进行转义。

但是,这并不总能产生所需的行为。例如:

var sNeedle = '*Stars!*';
var sMySTR = 'The contents of this string have no importance';
sMySTR.search('\Q' + sNeedle + '\E');

结果是-1。行。

var sNeedle = '**Stars!**';
var sMySTR = 'The contents of this string have no importance';
sMySTR.search('\Q' + sNeedle + '\E');

结果是“无效量词”。发生这种情况是因为2个或更多特殊字符互相“触摸”,因为:

var sNeedle = '*Dont touch me*Stars!*Dont touch me*';
var sMySTR = 'The contents of this string have no importance';
sMySTR.search('\Q' + sNeedle + '\E');

工作正常。

我知道我可以创建一个函数escapeAllBadChars(sInStr)并在每个可能的特殊正则表达式字符之前添加双斜杠,但我想知道是否有更简单的方法可以做到这一点?

4 个答案:

答案 0 :(得分:30)

\Q...\E在JavaScript中不起作用(至少,它们不会逃避任何事情......),你可以看到:

var s = "*";
print(s.search(/\Q*\E/));
print(s.search(/\*/));

产生

-1
0
正如您在Ideone上看到的那样

以下字符需要转义:

  • (
  • )
  • [
  • {
  • *
  • +
  • .
  • $
  • ^
  • \
  • |
  • ?

所以,像这样的事情会这样做:

function quote(regex) {
  return regex.replace(/([()[{*+.$^\\|?])/g, '\\$1');
}

不,]}不需要转义:它们没有特殊含义,只有它们的开放对应部分。

请注意,在使用文字正则表达式/.../时,您还需要转义/字符。但是,/不是正则表达式元字符:在RegExp对象中使用它时,它不需要转义。

答案 1 :(得分:4)

我只是在Javascript中沾沾自喜,但有什么理由需要使用正则表达式引擎吗? <怎么样

var sNeedle = '*Stars!*';
var sMySTR = 'The contents of this string have no importance';
if ( sMySTR.indexOf(sNeedle) > -1 ) {
   //found it
}

答案 2 :(得分:1)

我执行了快速Google搜索以查看其中的内容,看起来您有一些选项可以转义正则表达式字符。根据{{​​3}},您可以定义&amp;运行类似下面的函数来逃避有问题的字符:

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

或者,您可以尝试使用单独的库,例如one page,它已经处理了您尝试重新解决的细微差别。

答案 3 :(得分:0)

重复https://stackoverflow.com/a/6969486/151312

根据MDN,这是正确的(见上文中的解释):

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