【发布时间】:2013-06-11 20:07:20
【问题描述】:
我有以下代码:
var stringToMatch = "De$mond. \(blah)";
var pattern = "^" + stringToMatch;
var regex = new RegExp(pattern, "i");
return regex.test("testing De$mond.");
现在我需要先转义stringToMatch,然后才能在pattern 中使用它
如果我理解正确,我找到here 的解决方案建议使用此方法:
var stringToMatch = "De$mond. \(blah)";
stringToMatch = stringToMatch.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
var pattern = "^" + stringToMatch;
var regex = new RegExp(pattern, "i");
return regex.test("testing De$mond.");
为什么我不能简单地转义 stringToMatch 中的所有字符?
例如
var stringToMatch = "De$mond. \(blah)";
var stringToMatchAsArrayOfChars = [];
for (var i = 0; i < stringToMatch.length; i++)
{
stringToMatchAsArrayOfChars.push(stringToMatch.substr(i, 1));
}
var stringToMatchEscaped = "";
for (var i = 0; i < stringToMatchAsArrayOfChars.length; i++)
{
if (stringToMatchAsArrayOfChars[i] !== " ")
{
stringToMatchEscaped = stringToMatchEscaped + "\\" + stringToMatchAsArrayOfChars[i];
}
else
{
stringToMatchEscaped = stringToMatchEscaped + " ";
}
}
var pattern = "^" + stringToMatch;
var regex = new RegExp(pattern, "i");
return regex.test("testing De$mond.");
我知道上面的方法要冗长得多,但它的基本作用是:
var stringToMatchEscaped = "\D\e\$\m\o\n\d\. \\\(\b\l\a\h\)";
但它不起作用。这是为什么?
而且,除了我提供的链接中建议的方法之外,还有其他方法可以逃避stringToMatch 吗?即没有指定要转义的字符,就像使用 /[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g 完成的那样?
【问题讨论】:
-
因为如果你逃脱了
dog,你会得到\d\o\g。\d是[0-9]的简写。\D匹配[^0-9]。 -
嗯.. 没有意识到 :-) 你是对的。所以我绝对需要对一组特定字符进行转义,不参考特定字符就没有其他方法了吗?
-
为什么首先需要这样做?您实际上想用这段代码完成什么?
-
这只是我正在构建的一个简单的搜索引擎。我有一个字符串数组,用户可以输入一个单词。然后我在该数组中查找匹配项,但鉴于我使用正则表达式查找匹配项,我显然需要转义用户输入中的字符
-
@TheNortonCommander 如果您按字面意思匹配输入,为什么不直接使用
indexOf而不是通过正则表达式引擎来追踪它?
标签: javascript regex escaping