【问题标题】:MongoDB RegEx not workingMongoDB 正则表达式不工作
【发布时间】:2017-04-17 10:36:24
【问题描述】:

我正在尝试返回 obsNum 字段以 1. 开头的文档。我编写了以下正则表达式来过滤掉这些文档,但是它返回所有以1开头的文档

Observations.getObservationsModelObject().find({
    "ageGroup": ageGroup,
    "obsNum": {
        $regex: '^\s*1\.'
    }
}, function(err, foundData) {});

我做错了什么?

此 RegEx '^\s*1\.' 返回以下内容,而不是返回 1.3、1.1 和 1.2:

obsNum:  1.3
obsNum:  1.1
obsNum:  1.2
obsNum:  123
obsNum:  121`

【问题讨论】:

  • 您将正则表达式作为字符串传递,因此反斜杠需要双转义。使用$regex: /^\s*1\./
  • @Tushar 你是绝对正确的。这是我的正则表达式的唯一问题。你能告诉我为什么我们需要在正则表达式字符串中加入双反斜杠吗?
  • 因为在字符串中,反斜杠用于转义后面的字符。因此,一个用于转义,另一个用于正则表达式中的元字符。或者简单地使用正则表达式文字语法,如第一条评论所示。

标签: javascript regex mongodb


【解决方案1】:

'^\s*1\.' 是一个字符串。删除反斜杠转义后的正则表达式将为^s*1.,这意味着字符串应以任意数量的空格开头,后跟 1,然后是任意字符。

您可以使用正则表达式文字语法

$regex: /^\s*1\./

或双转义反斜杠

$regex: '^\\s*1\\.'

我建议尽可能使用文字语法,因为它既简单又不易出错。

【讨论】:

    【解决方案2】:

    您可以尝试的正则表达式是:

    ^(1\.\d+)
    

    解释:

    • ^字符串开头
    • (…)捕获括号:记住匹配项
    • 1字面数字
    • \d十进制数
    • +至少一个

    【讨论】:

      猜你喜欢
      • 2015-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-01
      • 2014-08-19
      • 2014-12-03
      • 1970-01-01
      • 2012-07-24
      相关资源
      最近更新 更多