MongoDB ObjectID的正则表达式

55

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

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

我的使用情况是我正在使用一组十六进制字符串,并且只想验证那些是mongodb对象ID的值。


2
112345679065574883030833FFFFFFFFFFFFFFFFFFFFFFFF也是有效的十六进制表示。为什么这些字符串返回false - falsetru
根据我的使用情况,我需要一个只匹配 MongoDB ObjectIDs 的正则表达式。@falsetru - gmajivu
1
如 @olegshparber 所回答的,上述所有 ID 都构成了一个有效的 MongoDB 对象 ID,请参考 MongoDB 对象 ID 文档。 - pshirishreddy
@gabeno 我还是不明白你想做什么,因为这三个都是有效的 MongoDB ObjectIDs。 - JohnnyHK
1
他想在实践中匹配MongoDB的ObjectIDs,而不是在理论上。 - tadasajon
5个回答

110

您可以使用以下正则表达式,但它可能不完全起作用

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
需要使用 i 标志吗? - transang
1
@transang,是的,它可以忽略大小写。 - falsetru
1
它可以被移除,但这会使正则表达式本身变长 /^[a-fA-F\d]{24}$/。不确定性能影响如何,但我认为如果有影响,它将是最小的(至少在这种情况下)。 - Stephan Bijzitter
ObjectId.TryParse对于“FFFFFFFFFFFFFFFFFFFFFFFF”返回true。 - Kishan Vaishnav
@KishanVaishnav,我不知道TryParse是什么。我认为它不是JavaScript方法。(这个问题标记了JavaScript)。发一个单独的问题怎么样? - falsetru
1
抱歉,这是一个C#方法。我只是想确认Mongo驱动程序似乎认为它是一个有效的ObjectId。 - Kishan Vaishnav

24

我需要一个正则表达式,只匹配 MongoDB 的 ObjectID。

如果您需要这样做,您必须明确指定 MongoDB ObjectID 的构成方式,以便我们可以创建相应的正则表达式字符串。


这段代码在 JavaScript 中应该可以正常工作:

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

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

5

从技术上讲,问题中的所有示例都可能是有效的ObjectId。如果您需要添加一些额外的验证,并且正则表达式不足够,请检查前4个字节是否为有效的时间戳。您甚至可以验证ObjectId是否在某个特定时间段内生成(例如自项目启动以来)。有关详细信息,请参见ObjectId documentation

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

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


3
我会做类似这样的事情。
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") returns true - Kevin Beal

0

对于那些只是想要检查十六进制字符串的人:

s := "5fa0ef460c2056137465a39b"
if _, err := hex.DecodeString(s); err == nil {
    fmt.Println("ok")
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接