MongoDB ObjectID的正则表达式

时间:2014-01-08 06:27:26

标签: javascript regex mongodb

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

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

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

4 个答案:

答案 0 :(得分:53)

您可以使用以下正则表达式,但它不会正常工作

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因为它通过了所有上述测试

答案 1 :(得分:5)

从技术上讲,问题中的所有示例都可能是有效的ObjectIds。如果你必须添加一些额外的验证并且regexp是不够的,那么我的建议是检查前4个字节是否是有效的时间戳。您甚至可以验证ObjectId是否在特定时间段内生成(例如,因为您的项目已经启动等)。有关详细信息,请参阅ObjectId documentation

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

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

答案 2 :(得分:4)

  

我需要一个只匹配mongodb ObjectIDs

的正则表达式

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


这在技术上应该适用于js:

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

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

答案 3 :(得分:2)

我会做这样的事情

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