Regex 如何在Mongoose查询中将变量与解析的电子邮件进行比较?

Regex 如何在Mongoose查询中将变量与解析的电子邮件进行比较?,regex,mongoose,Regex,Mongoose,不[重复]:这个问题以前没有得到回答,而且被不公平地否决了。来自不同来源的两个有标记的答案是关于不同的事情的。结合起来,他们可能在某种程度上回答了部分问题,但他们没有解决此处所问问题的具体情况,例如,他们中没有人在比较变量之前解释如何解析电子邮件。我需要提取电子邮件的前半部分,将其与字符串变量进行比较,然后使用mongoose执行查询 我找到了这个问题的许多部分答案/^[^@]*/但没有显示如何将筛选器应用于搜索给定字符串的部分电子邮件字段和Mongoose查询 有了这个,我就有了一个由用户提供

不[重复]:这个问题以前没有得到回答,而且被不公平地否决了。来自不同来源的两个有标记的答案是关于不同的事情的。结合起来,他们可能在某种程度上回答了部分问题,但他们没有解决此处所问问题的具体情况,例如,他们中没有人在比较变量之前解释如何解析电子邮件。我需要提取电子邮件的前半部分,将其与字符串变量进行比较,然后使用mongoose执行查询

我找到了这个问题的许多部分答案/^[^@]*/但没有显示如何将筛选器应用于搜索给定字符串的部分电子邮件字段和Mongoose查询

有了这个,我就有了一个由用户提供的搜索,而不是过滤器:

我有一个过滤器,但没有搜索:

我需要找到一种方法在一次搜索中同时执行这两项操作,只搜索带有给定字符串变量的电子邮件的前半部分。我的意图是忽略@符号后面的所有内容,包括不应包含在字符串变量搜索中的@。我需要找到一种在正则表达式过滤器中插入搜索的方法

再次,它应该忽略/排除所有从“@”到电子邮件地址的结尾,搜索不应该考虑这一部分。 搜索是一个变量 提前谢谢

/^[^@]*搜索/就可以了。这将从字符串的开头搜索文字匹配搜索。只要字符串开头和搜索之间的字符不是@字符。这意味着foo bar搜索会命中,但是foo@bar搜索没有

如果搜索是一个变量,那么您可能需要查看一下

结合以上两种选项,您将获得:

var regex = new RegExp('^[^@]*' + search);
User.find({email: {$regex: regex, $options: "i"}});
但是,如果搜索包含不应解释为regex的用户内容,则应如下所示:

// Assuming that the following helper is present.
RegExp.escape = function(s) {
    return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
};
因此,不需要创建JS RegExp对象,您可以将上述操作简化为:

User.find({email: {$regex: '^[^@]*' + RegExp.escape(search), $options: "i"}});

你是说{email:{$regex:newregexp^[^@]*+search,i}}吗?谢谢你的回答。我刚试过,但没用。也就是说,它在结果中包含了电子邮件的域部分,而不应该包含。我编辑了我的问题以使它更清楚。确实有很多问题,但不确定它们是否适合你。检查或。再次感谢您的尝试。但我并没有试图替换或更新任何东西。这应该是一个简单的查找查询。唯一的问题是如何查询的不是整个电子邮件字段,而是前半部分,例如:包括my.first_name,但不包括/忽略@google.com。@Wiktor真的,你为什么要这样做?首先你抱怨约翰的回答,现在你对我的问题做出错误的假设?我以为我们以前把它清理干净了。这两个答案是关于两件不同的事情。这些可能在某种程度上有助于回答这个问题,但无助于解决这个具体问题。John通过重写所有内容实现了这一点。search是一个变量,包含用户在前端提供的给定字符串。我试图在电子邮件中搜索此字符串,但只搜索其前半部分。我已更新了答案,并重定向到另一个SO问题,即如何在正则表达式中放置变量。我注意到并更新了我的问题,以澄清这一点。谢谢现在我将查看您提供的链接,并再次回答您的问题。这不是将变量放入正则表达式。如果你认为这是唯一的问题,那么这个问题应该作为一个傻瓜来结束,没有必要重复已经回答过的问题。然而,OP需要一个不同的解决方案,尽管包括传递给regexp的变量。@WiktorStribiżew在我看来,这不值得投反对票。每当你遇到一篇极其草率、不费吹灰之力的帖子,或是一个明显而且可能危险地错误的答案时,请投反对票这个答案不符合这些标准,当然你可以自由地投反对票。我只是指出显而易见的事实。
// Assuming that the following helper is present.
RegExp.escape = function(s) {
    return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
};
var regex = new RegExp('^[^@]*' + RegExp.escape(search));
User.find({email: {$regex: regex, $options: "i"}});
User.find({email: {$regex: '^[^@]*' + RegExp.escape(search), $options: "i"}});