【问题标题】:Mongo DB and Java ends with RegexMongodb 和 Java 以 Regex 结尾
【发布时间】:2023-04-02 00:52:01
【问题描述】:

我正在尝试使用以下代码从我的数据库中获取页面路径以某个表达式结尾的所有文档:

query.put(pagepath, new BasicDBObject(
"$regex", "/(" +expression+ ")$/"));

其中表达式被替换为“.html”、“.JSON”、“contact/”、“/”等值... 即使在https://regex101.com/ 上测试我的正则表达式时,我也没有收到任何错误但也没有结果,它可以工作并且其中一个链接至少匹配。

【问题讨论】:

  • 试试expression + "$"。此外,您需要以某种方式逃避.。所以,也许是BasicDBObject query = new BasicDBObject();,然后是query.put(pagepath, Pattern.compile(Pattern.quote(expression)+"$"));
  • tanks 但它不起作用,我的查询看起来像这样:{ "\"pagepath\"" : { "$regex" : "\\Q.html\\E$"}}
  • 列名应该在双引号内吗?无论如何,现在正则表达式似乎是正确的。
  • 是的,那部分没问题(y)
  • 该查询在 regex101.com 中有效,但在 Robomongo 中无效:

标签: regex mongodb mongodb-java mongo-java-driver


【解决方案1】:

解决expression中的任何特殊字符和字符串中潜在的换行符的解决方案是

query.put(pagepath, new BasicDBObject("$regex", "(?s).*" + Pattern.quote(expression) + "$"));

四点是:

  • 你需要匹配整个字符串,所以你需要在expression之前使用.*
  • 如果字符串有换行符,您需要传递(?s) DOTALL 修饰符,以便. 也可以匹配换行符
  • 您需要 Pattern.quote 和 expression 才能正确处理其中包含 [ 的查询
  • 在expression 周围不需要( 和),因为以后不会在任何地方使用此捕获组。

【讨论】:

    【解决方案2】:

    这是解决方案:query.put(pagepath, new BasicDBObject("$regex", ".*(" + expression + ")$"));

    【讨论】:

    • 好的,这意味着您需要在后台匹配整个字符串matches()。不过,这不是完全正确的方法,因为您需要引用 expression,否则,如果它包含特殊的正则表达式元字符,您将收到错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    • 2019-06-26
    • 1970-01-01
    • 2014-09-21
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多