与任意(用户提供的)字符串匹配的正则表达式

时间:2013-02-21 14:02:01

标签: javascript regex

用户将提供字符串,我想通过预定义字符串列表搜索该字符串。诀窍是用户的字符串可以是任何东西,可能包括像[*。?^等等的正则表达式字符。所以类似

"first half of my regex"   + `USER_STRING` +  "second half of my regex"

不起作用。一个显而易见的解决方案是逃避USER_STRING中所有特殊字符的转义对象,但必须有更好的方法。

PS:另外,简单的字符串搜索不会这样做,因为我需要匹配字符串左右两侧的模式。

2 个答案:

答案 0 :(得分:0)

JavaScript没有内置的正则表达式转义函数(例如,类似于PHP' s preg_quote)。有些人自己创造了一个等价物,但是:https://stackoverflow.com/a/6829401/454533

所以不,那不是更好的方式。

答案 1 :(得分:0)

只需使用此函数即可确保引用所有特殊字符并将其视为正则表达式中的文字字符:

function escapeRegex(input) {
    return input.replace(/[[\](){}?*+^$\\.|]/g, '\\$&');
}

该函数期望String作为输入并输出一个字符串,其中包含所有转义的特殊字符。这意味着创建一个String,可以将其提供给RegExp构造函数以创建与原始字符串匹配的正则表达式。关于是否可以安全地连接此方法的输出,请查看下面的附加说明。

MDN上的all special characters in JS regex列表。

  • 关于这些^$.|*?,{{ 1}}。
    如果是第一个字符,这也有效地禁用+ ^内部的特殊含义,如果是第一个字符,则[]?。{
    1}} ()的相同内容以及跟随量词的惰性匹配行为。

  • ?仅在-内有意义 - 但在[][被转义时不再有效。 如果模板字符串为],则可能存在问题。我不在此处模拟字符类中"[" + input + "]"\Q的行为,但如果您愿意,可以在上述函数中将\E添加到正则表达式。

    < / LI> 当-转义时,
  • \后跟一些特殊序列将失去意义。
    在相关的说明中,上面我的方法失败的情况是模板字符串是\。但是,我会说 错误在于谁写了模板字符串 ,因为这完全没有意义。

  • "\\" + input:=仅在!内有意义(对于非捕获组和预测),必须在{{1 }},但在转义()?时也失去了意义。 (已经转义,因此在)之间插入转义字符串时没有问题。
    如果没有转义那些,当模板字符串为?时,上述方法将失败。我再次责怪谁写这个,因为他们是允许注射的人。

  • ()仅在"(?" + input + ")"内有意义,但在,{}转义时失去了意义。
    转义失败的情况是指您拥有模板字符串(例如,匹配初始值设定项){,但通常情况下,将会转义}"\\w+ = {" + input + "}"模板字符串,如果打算将它们作为文字字符匹配 还有重复的情况,但是,模板字符串应该是{,并且必须首先清理输入。

总之,必须正确转义模板字符串中的元字符才能使任何转义函数起作用。如果要在字符类中使用转义字符串,请将}添加到字符类。