我想在字符串中进行字符串搜索。只需说 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/