我很确定如果不首先使用以下函数转义“魔术”正则表达式字符,就没有更简单的方法可以满足您的需求:
function escapeRegExpChars(text) {
return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
}
因此,假设您正在搜索用户句柄(伪)“$Foo(.)Bar+”,您将:
var query = new RegExp(escapeRegExpChars(handle),'i')
产生:
/\$Foo\(\.\)Bar\+/i
但是使用 RegExp 搜索数据库中的记录也有缺点,最麻烦的是RegExp 必须单独应用于每条记录。这称为对表的“全扫描”,效率非常低。
为了显着提高性能(通过消除对全表扫描的要求),我会在数据库中保留两个句柄副本,一个用于显示目的,另一个用于简化搜索。
要创建面向搜索的句柄,您可以:
function createEscapedHandle(handle){
return handle.toLowerCase().replace(/(\W)/g,function(ch){
return '%' + ch.charCodeAt(0).toString(16);
});
}
var handle = '$Foo(.)Bar+',
escapedHandle = createEscapedHandle(handle);
// where escaped handle is '%24foo%28%2e%29bar%2b'
将原始句柄及其转义版本保存在您的数据库中,然后搜索转义版本。
我相信您会发现,在处理(将 RegExp 与每条记录匹配)与保存转义版本句柄所需的额外存储空间之间的这种权衡将为您提供明显更快的结果。