如何在regexp中正确转义字符

use*_*105 15 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');
Run Code Online (Sandbox Code Playgroud)

结果是-1.好.

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

结果是"无效量词".发生这种情况是因为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');
Run Code Online (Sandbox Code Playgroud)

会工作好吗.

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

Bar*_*ers 32

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

var s = "*";
print(s.search(/\Q*\E/));
print(s.search(/\*/));
Run Code Online (Sandbox Code Playgroud)

生产:

-1
0
Run Code Online (Sandbox Code Playgroud)

正如你在Ideone上看到的那样.

以下字符需要转义:

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

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

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

不,]并且}不需要逃脱:它们没有特殊意义,只有它们的开口对应部分.

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