Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在regexp中正确转义字符_Javascript_Regex_Escaping - Fatal编程技术网

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, "\\$&");
}