0

我将 NodeJS 与猫鼬一起使用,我的目标是检查用户请求的伪是否尚未使用。我想让用户选择大写字母的伪,但如果“foo”已经在使用中,我不希望用户选择“Foo”。

我知道我可以使用.find({pseudo: /foo/i}),但我需要在正则表达式中注入一个变量:new RegExp(pseudoToCheck, 'i')

在这一点上,我被卡住了,因为如果pseudoToCheck包含正则表达式使用的任何特殊字符,正则表达式将失败。

我应该使用函数来逃避“伪”吗?有没有更简单的方法来做我想做的事?

谢谢

(对不起我的英语不好)

4

2 回答 2

3

我很确定如果不首先使用以下函数转义“魔术”正则表达式字符,就没有更简单的方法可以满足您的需求:

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 与每条记录匹配)与保存转义版本句柄所需的额外存储空间之间的这种权衡将为您提供明显更快的结果。

于 2013-07-05T17:16:49.593 回答
0

使用符号进行不区分大小写的搜索。MongoDB 控制台:

db.keywordsdocs.find({keyword:{ $regex:new RegExp('^' + 'string with symbols and different cases'.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') + '$', 'i')}});

猫鼬:

keywordsdocs.find({keyword:{$regex: new RegExp('^' + "string with symbols and different cases".replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') + '$', 'i')}},function(err, key) { console.log(key)});
于 2018-06-14T08:28:53.707 回答