【问题标题】:How to properly escape characters in regexp如何正确转义正则表达式中的字符
【发布时间】:2011-08-05 13:25:42
【问题描述】:

我想在字符串中进行字符串搜索。简单地说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 在 Perl 中工作,但不确定其他任何地方。
  • 我认为你的第三个例子中的明星没有按照你的想法做。它们不会被解释为文字 * 字符,而是作为它们之前字符的量词。
  • @Matthew,在 Java 中它的工作方式与在 Perl 中相同(不确定其他语言)。

标签: javascript regex escaping


【解决方案1】:

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

【讨论】:

  • 字符 / 也需要转义
  • @TheoZ,我不会打电话给/ de regex meta char。仅当您使用文字正则表达式时才需要转义。使用RegExp 对象创建正则表达式时,它不需要转义。不过既然我举了/.../的例子,提一下就好了。
【解决方案2】:

https://stackoverflow.com/a/6969486/151312 的副本

根据 MDN,这是正确的(请参阅上面帖子中的说明):

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

【讨论】:

    【解决方案3】:

    我只是涉足 Javascript,但您是否有理由需要使用正则表达式引擎?怎么样

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

    【讨论】:

    • 我还没有真正想过这个。我应该将 .search() .match() .replace() 与字符串一起使用。事实上,我想做的就是使用 sNeedle 作为简单的文本字符串,所以我认为 indexOf 肯定是个好主意。
    【解决方案4】:

    我在 Google 上进行了快速搜索以查看其中的内容,您似乎有一些选项可以转义正则表达式字符。根据one page,您可以定义并运行如下函数来转义有问题的字符:

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

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

    【讨论】:

      猜你喜欢
      • 2019-11-19
      • 2020-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-22
      相关资源
      最近更新 更多