我正在摆弄MongoDB,我偶然发现了一些事情。我想创建一个简单的应用程序,用户可以在其中搜索集合中的所有文档,获取密钥username
包含某个用户输入值的文档。
为了实现“包含”它appears,可以使用正则表达式。这工作正常,但我如何将用户输入转换为正则表达式?问题是只是做......
new RegExp(value);
...由于特殊字符(例如(
,[
等)无效。这意味着用户无法以这种方式执行包含(
的查询。
我认为逃避一切都可以胜任:
new RegExp(value.replace(/./g, function(x) {
return "\\" + x;
});
...但它并不是因为某些转义字符也很特殊(例如\d
),所以这种非特殊字符变得特殊。
我有点迷失了如何将用户输入的值转换为正则表达式。或者,对于包含某个用户输入值的键的所有文档,是否有更好的方法可以查询?
答案 0 :(得分:2)
<强>实施强>
基于this source。
var oldText = "[hello, world :) ]";
var sre = new RegExp('(\\' + ['/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\'].join('|\\') + ')', 'g');
var newText = oldText.replace(sre, '\\$1'); // "\[hello, world :\) \]"
进一步说明:
sre 是一个正则表达式,它匹配所有可能的特殊字符并使用括号,因此它可以引用匹配的部分。
不完整 sre 示例:
/(\/|\.|\\)/g
这会尝试匹配以下任何字符:“/”,“。”和“\”。然后使用
text.replace(sre, '\\$1');
将使用“\”转义文本中每个匹配的字符。所以它将取代“。”用“\。”等等。