【问题标题】:Regex for MongoDB ObjectIDMongoDB ObjectID 的正则表达式
【发布时间】:2014-01-26 03:04:42
【问题描述】:

参考this SO question,我有一个场景,我只需要匹配一个包含 a-f 的十六进制字符串。其他一切都不应该匹配。示例:

checkForHexRegExp.test("112345679065574883030833"); // => false
checkForHexRegExp.test("FFFFFFFFFFFFFFFFFFFFFFFF"); // => false
checkForHexRegExp.test("45cbc4a0e4123f6920000002"); // => true

我的用例是我正在使用一组十六进制字符串,并且只想将那些是 mongodb objectID 的字符串验证为 true。

【问题讨论】:

  • 112345679065574883030833, FFFFFFFFFFFFFFFFFFFFFFFF 也是有效的十六进制表示。为什么false 用于这些字符串?
  • @falsetru 根据我的用例,我需要一个只匹配 mongodb ObjectIDs 的正则表达式。
  • 正如@olegshparber 所回答的,上述所有ID 构成了一个有效的mongodb 对象ID,请参阅mongodb 对象ID 文档
  • @gabeno 我仍然不明白您要做什么,因为这三个都是有效的 MongoDB ObjectID。
  • 他想在实践中匹配 MongoDB ObjectID,而不是理论上。

标签: javascript regex mongodb


【解决方案1】:

我需要一个只匹配 mongodb ObjectIDs 的正则表达式

如果您需要,您必须准确指定 mongodb ObjectID 的组成部分,以便我们可以为其创建适当的正则表达式字符串。


这在技术上应该可以在 js 中工作:

var myregexp = /^[0-9a-fA-F]{24}$/;
subject = "112345679065574883030833";

if (subject.match(myregexp)) {
    // Successful match
} else {
    // Match attempt failed
}

【讨论】:

    【解决方案2】:

    从技术上讲,问题中的所有示例都可能是有效的 ObjectId。如果您必须添加一些额外的验证并且 regexp 还不够,那么我的建议是检查前 4 个字节是否是有效的时间戳。您甚至可以验证 ObjectId 是否已在某个时间段内生成(例如,自从您的项目启动以来)。详情请见ObjectId documentation

    如果对象中有另一个时间戳字段,那么也可以确保两个时间非常接近。

    仅供参考,在MongoDB shell中ObjectId::getTimestamp()方法可用于从ObjectId中提取时间戳。

    【讨论】:

      【解决方案3】:

      你可以使用下面的正则表达式但是不太好用

      checkForHexRegExp = /^(?=[a-f\d]{24}$)(\d+[a-f]|[a-f]+\d)/i
      

      例子:

      > checkForHexRegExp.test("112345679065574883030833")
      false
      > checkForHexRegExp.test("FFFFFFFFFFFFFFFFFFFFFFFF")
      false
      > checkForHexRegExp.test("45cbc4a0e4123f6920000002")
      true
      

      但是,正如我所评论的,112345679065574883030833FFFFFFFFFFFFFFFFFFFFFFFF 也是有效的十六进制表示。

      您应该使用 /^[a-f\d]{24}$/i,因为它通过了上述所有测试

      【讨论】:

      • 是否需要i 标志?
      • @transang,是的。 (忽略大小写)
      • 虽然它可以被删除,但这会使正则表达式本身更长/^[a-fA-F\d]{24}$/。不确定性能影响是什么,但我假设如果有,它会是最小的(至少在这种情况下)
      • ObjectId.TryParse 为“FFFFFFFFFFFFFFFFFFFFFFFF”返回真
      • 对不起,这是一个 C# 方法。我只是想断言 Mongo Driver 似乎认为它是一个有效的 ObjectId。
      【解决方案4】:

      我会做这样的事情

      function validateObjectId(id)
      {
          var bool=false; 
          if(id.length==24) bool=/[a-f]+/.test(id);
          return bool;
      }
      
      
      > validateObjectId("112345679065574883030833")
        false
      > validateObjectId("FFFFFFFFFFFFFFFFFFFFFFFF")
        false
      > validateObjectId("45cbc4a0e4123f6920000002")
        true
      > validateObjectId("45cbc4a0e4123f6920")
        false
      

      【讨论】:

      • validateObjectId("ffffffffffffffffffffffff") 返回true
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-28
      相关资源
      最近更新 更多