【问题标题】:How do I escape a string used in a RegExp object如何转义 RegExp 对象中使用的字符串
【发布时间】:2013-06-11 20:07:20
【问题描述】:

我有以下代码:

var stringToMatch = "De$mond. \(blah)";
var pattern = "^" + stringToMatch;
var regex = new RegExp(pattern, "i");

return regex.test("testing De$mond.");

现在我需要先转义stringToMatch,然后才能在pattern 中使用它

如果我理解正确,我找到here 的解决方案建议使用此方法:

var stringToMatch = "De$mond. \(blah)";
stringToMatch = stringToMatch.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");

var pattern = "^" + stringToMatch;
var regex = new RegExp(pattern, "i");

return regex.test("testing De$mond.");

为什么我不能简单地转义 stringToMatch 中的所有字符?

例如

  var stringToMatch = "De$mond. \(blah)";
  var stringToMatchAsArrayOfChars = [];
  for (var i = 0; i < stringToMatch.length; i++)
  {
    stringToMatchAsArrayOfChars.push(stringToMatch.substr(i, 1));
  }
  var stringToMatchEscaped = "";
  for (var i = 0; i < stringToMatchAsArrayOfChars.length; i++)
  {
    if (stringToMatchAsArrayOfChars[i] !== " ")
    {
      stringToMatchEscaped = stringToMatchEscaped + "\\" + stringToMatchAsArrayOfChars[i];
    }
    else
    {
      stringToMatchEscaped = stringToMatchEscaped + " ";
    }
  }

  var pattern = "^" + stringToMatch;
  var regex = new RegExp(pattern, "i");

  return regex.test("testing De$mond.");

我知道上面的方法要冗长得多,但它的基本作用是:

  var stringToMatchEscaped = "\D\e\$\m\o\n\d\. \\\(\b\l\a\h\)";

但它不起作用。这是为什么?

而且,除了我提供的链接中建议的方法之外,还有其他方法可以逃避stringToMatch 吗?即没有指定要转义的字符,就像使用 /[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g 完成的那样?

【问题讨论】:

  • 因为如果你逃脱了dog,你会得到\d\o\g\d[0-9] 的简写。 \D 匹配 [^0-9]
  • 嗯.. 没有意识到 :-) 你是对的。所以我绝对需要对一组特定字符进行转义,不参考特定字符就没有其他方法了吗?
  • 为什么首先需要这样做?您实际上想用这段代码完成什么?
  • 这只是我正在构建的一个简单的搜索引擎。我有一个字符串数组,用户可以输入一个单词。然后我在该数组中查找匹配项,但鉴于我使用正则表达式查找匹配项,我显然需要转义用户输入中的字符
  • @TheNortonCommander 如果您按字面意思匹配输入,为什么不直接使用 indexOf 而不是通过正则表达式引擎来追踪它?

标签: javascript regex escaping


【解决方案1】:

这是一个简单的正则表达式,用于从字符串输入中生成安全的正则表达式模式。

  var pattern= "De$mond.";
  var regex = new RegExp(pattern.replace(   /([.*+?^${}()|[\]\/\\])/g   , '\\$1'), "i");

  regex.test("testing De$mond. string here."); // === true

请注意,这意味着您不能使用“通配符”或任何正则表达式语法,但您最终会得到一个真正的正则表达式,它将执行从源文本到模式的文字匹配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-02
    • 2019-01-29
    • 1970-01-01
    • 2018-08-28
    • 2013-12-27
    • 1970-01-01
    相关资源
    最近更新 更多