问题描述
|
我想在字符串中进行字符串搜索。简单地说“ 0”。
当此“ 1”字符串包含特殊的正则表达式字符(例如*,+等)时,就会出现问题。它失败,并显示错误“ 2”。
我浏览了网络,发现可以用
\\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\');
}
不,]
和}
不需要逃脱:它们没有特殊含义,只需要打开它们的对应部分即可。
请注意,使用文字正则表达式/.../
时,还需要转义/
字符。但是,ѭ27不是一个正则表达式元字符:在ѭ29对象中使用时,不需要转义。
,我只是想用Java脚本,但是有没有理由需要使用regex引擎?怎么样
var sNeedle = \'*Stars!*\';
var sMySTR = \'The contents of this string have no importance\';
if ( sMySTR.indexOf(sNeedle) > -1 ) {
//found it
}
,我快速进行了一次Google搜索,以查看其中的内容,看来您可以使用几种方式来转义正则表达式字符。根据一页的内容,您可以定义并运行以下函数来转义有问题的字符:
RegExp.escape = function(text) {
return text.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g,\"\\\\$&\");
}
另外,您可以尝试使用单独的库(例如XRegExp),该库已经处理了您要重新解析的细微差别。
,重复的https://stackoverflow.com/a/6969486/151312
根据MDN,这是正确的(请参见上面的说明):
function escapeRegExp(str) {
return str.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g,\"\\\\$&\");
}