【问题标题】:Mongodb regex not matching exact when . (dot) in searchMongodb 正则表达式与 . (点)在搜索中
【发布时间】:2019-05-16 06:35:38
【问题描述】:

我想检查电子邮件是否已在我的 MongoDB 数据库中注册。
我有一个用户注册test123@test.com
但如果我检查 test.23@test.com 它仍然匹配 test123@test.com 的记录
我尝试了以下查询

db.getCollection('users').find(
     {"email":{ $regex: new RegExp(test.23@test.com, "i") } 
})

db.getCollection('users').find(
         {"email":{ $regex: new RegExp(/test.23@test.com/, "i") } 
})

db.getCollection('users').find(
         {"email":{ $regex: new RegExp(/^(test.23@test.com)$/, "i") } 
})

db.getCollection('users').find(
         {"email":{ $regex: new RegExp(/^(test.23@test\.com)$/, "i") } 
})

如何在不区分大小写的情况下搜索完全匹配?

【问题讨论】:

  • 该点匹配除换行符以外的任何字符,因此 1 也将匹配。如果你想从字面上匹配它,你必须像 \. 一样逃避它。
  • new RegExp(/test123@test.com\./, "i") 我试过了,但它甚至不匹配实际
  • 您在电子邮件后添加了一个点。我认为它应该是new RegExp(/test123@test\.com/, "i"),但如果你想从字面上找到它,为什么要使用正则表达式?
  • new RegExp(/test.23@test\.com/, "i") 这仍然匹配test123@test.com
  • 那应该是new RegExp(/test\.23@test\.com/, "i") 还要注意第一个转义点。

标签: regex mongodb mongodb-query


【解决方案1】:

你不需要做正则表达式。 Mongodb 从 v3.4 开始支持 collations

db.getCollection('users').find(
     {"email":"test.23@test.com"} 
).collation(
     {locale:"en", strength: 1}
)

将匹配“test.23@test.com”、“TEST.23@TEST.COM”以及介于两者之间的任何内容。

作为旁注,将用户的输入直接传递给正则表达式查询,您有可能有一天会丢失您的服务器。阅读灵感https://www.rexegg.com/regex-explosive-quantifiers.html 如果您决定继续使用正则表达式方法,您可以在从正则表达式语法中转义括号、括号、转义字符和其他特殊符号时转义点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 2023-03-14
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 2015-01-05
    相关资源
    最近更新 更多