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

标签 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) 并在每个可能的特殊正则表达式字符前添加双斜杠,但我想知道是否有更简单的方法来做到这一点?

最佳答案

如您所见,

\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 对象中使用它时,它不需要转义。

关于javascript - 如何正确转义正则表达式中的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5663987/

相关文章:

javascript - 需要找到源路径正则表达式

java - 电子邮件列表的正则表达式模式

regex - 使用正则表达式查找包含某个单词的 block

python - 将带有反斜杠后跟数字的字符串转换为路径

php - 试图阻止文本区域中的项目符号作为特殊字符进入我的数据库

swift - 如何修复 : "passing non-escaping parameter to function expecting @escaping closure"

Javascript for循环卡住浏览器,没有语法错误

javascript - 在 jasmine 中循环 it() 描述未找到输出规范

javascript - 如何使用来自 Web 服务的 JSON 数据填充 Angular 中的表?

javascript - 内部/模块/cjs/loader.js :888 throw err;