用户将提供字符串,我想通过预定义字符串列表搜索该字符串。诀窍是用户的字符串可以是任何东西,并且可能包含正则表达式字符,如 [*.?^ 等。所以像
"first half of my regex" + `USER_STRING` + "second half of my regex"
不会工作。一个明显的解决方案是将所有特殊字符USER_STRING
与它们的转义对应项一起转义,但必须有更好的方法。
PS:另外,简单的字符串搜索不会做,因为我需要匹配字符串左侧和右侧的模式。
用户将提供字符串,我想通过预定义字符串列表搜索该字符串。诀窍是用户的字符串可以是任何东西,并且可能包含正则表达式字符,如 [*.?^ 等。所以像
"first half of my regex" + `USER_STRING` + "second half of my regex"
不会工作。一个明显的解决方案是将所有特殊字符USER_STRING
与它们的转义对应项一起转义,但必须有更好的方法。
PS:另外,简单的字符串搜索不会做,因为我需要匹配字符串左侧和右侧的模式。
JavaScript 没有内置的正则表达式转义函数(例如,类似于 PHP 的preg_quote
)。不过,有些人已经自己创建了一个等价物:https ://stackoverflow.com/a/6829401/454533
所以不,没有更好的方法。
只需使用此函数确保在正则表达式中引用所有特殊字符并将其视为文字字符:
function escapeRegex(input) {
return input.replace(/[[\](){}?*+^$\\.|]/g, '\\$&');
}
该函数需要一个字符串作为输入,并输出一个所有特殊字符都已转义的字符串。这意味着创建一个字符串,可以将其馈送到RegExp
构造函数以创建与原始字符串匹配的正则表达式。关于此方法的输出是否可以安全连接,请查看下面我的附加说明。
MDN 上JS 正则表达式中所有特殊字符的列表。
这些没什么好说^
的$
,,,,,,,,。.
_ |
_
这也有效地禁用了inside if the first character 和inside if the first character 的特殊含义。
跟在量词之后的 for和惰性匹配行为相同。 *
?
+
^
[]
?
()
?
-
仅在内部有意义-但在,被转义[]
时不再有意义。如果模板字符串是. 我不在这里模拟字符类的行为和内部字符类,但如果你愿意,你可以在上面的函数中添加正则表达式。[
]
"[" + input + "]"
\Q
\E
-
\
\
后面跟一些特殊的序列在转义时会失去意义。
在相关说明中,我上面的方法失败的情况是模板字符串为"\\" + input
. 但是,我会说错误在于编写模板字符串的人,因为这完全是胡说八道。
:
, =
,!
仅在内部有意义()
(对于非捕获组和前瞻)并且必须在之后,但在和被转义?
时也失去了意义。已经被转义了,所以当转义字符串插入到 之间时不会出现问题。
如果不转义这些,当模板字符串为. 我再次责怪写这篇文章的人,因为他们是允许注射的人。(
)
?
()
"(?" + input + ")"
,
只是在里面有意义,但在被转义的时候就{}
失去了意义。转义失败的情况是当您拥有模板字符串(例如,匹配初始化程序)时,但通常情况下,如果打算将它们作为文字字符匹配,则会转义并在模板字符串中。
也有重复的情况,但是模板字符串应该是,并且输入必须首先被清理。 {
}
"\\w+ = {" + input + "}"
{
}
".{" + start + "," + end + "}
总之,模板字符串中的元字符必须正确转义才能使任何转义函数起作用。如果要在字符类中使用转义字符串,请添加-
到字符类。