Javascript 如何在regexp中正确转义字符
我想在字符串中进行字符串搜索。简单地说Javascript 如何在regexp中正确转义字符,javascript,regex,escaping,Javascript,Regex,Escaping,我想在字符串中进行字符串搜索。简单地说MySTR.search(Needle) 当此指针字符串包含特殊的正则表达式字符(如*、+等)时,就会出现问题。它失败,出现错误无效量词 我浏览了网页,发现字符串可以用\Q some string\E转义 然而,这并不总是产生期望的行为。例如: var sNeedle = '*Stars!*'; var sMySTR = 'The contents of this string have no importance'; sMySTR.search('\Q'
MySTR.search(Needle)
当此指针字符串包含特殊的正则表达式字符(如*、+等)时,就会出现问题。它失败,出现错误无效量词
我浏览了网页,发现字符串可以用\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');
结果是“无效量词”。发生这种情况的原因是两个或更多特殊字符相互“接触”,因为:
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)
,只需在每个可能的特殊正则字符前添加双斜杠,但是我想知道是否有一种更简单的方法可以做到这一点?我在谷歌上快速搜索了一下,看看那里有什么,似乎你有一些转义正则表达式字符的选项。根据,您可以定义并运行如下函数以转义有问题的字符:
RegExp.escape = function(text) {
return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
}
或者,您可以尝试使用一个单独的库,例如,它已经处理了您试图重新解决的细微差别。\Q…。\E
在JavaScript中不起作用(至少,它们不会逃避任何东西…),如您所见:
var s = "*";
print(s.search(/\Q*\E/));
print(s.search(/\*/));
产生:
-1
0
正如你在电视上看到的
需要转义以下字符:
(
)
[
{
*
+
$
^
\
|
?
所以,这样做可以:
function quote(regex) {
return regex.replace(/([()[{*+.$^\\|?])/g, '\\$1');
}
不,]
和}
不需要转义:它们没有特殊意义,只有它们的打开计数器部分
请注意,在使用文本正则表达式时,/…/
,还需要转义/
字符。但是,/
不是regex元字符:在RegExp
对象中使用它时,不需要转义 我只是在学Javascript,但是你有什么理由需要使用正则表达式引擎吗?怎么样
var sNeedle = '*Stars!*';
var sMySTR = 'The contents of this string have no importance';
if ( sMySTR.indexOf(sNeedle) > -1 ) {
//found it
}
副本
根据MDN,这是正确的(见上文中的解释):
\Q…。\E在Perl中工作,但不确定其他任何地方。我认为第三个示例中的星星并没有按照您的想法工作。它们不是被解释为literal*字符,而是作为前面字符的量词。@Matthew,在Java中它的工作原理与在Perl中相同(不确定其他语言)。我还没有真正考虑过这一点。我脑子里一直想我应该用字符串来使用.search().match().replace()。事实上,我只想使用sNeedle作为简单的文本字符串,所以我认为indexOf肯定是个好主意。character/需要作为well@TheoZ,我不会调用/
de regex meta char。当您使用文字正则表达式时,它只需要转义。使用RegExp
对象创建正则表达式时,不需要转义。但是因为我给出了一个关于/…/
的例子,所以提到它是一个好主意。
function escapeRegExp(str) {
return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
}