javascript Regex for MongoDB ObjectID

wtlkbnrh  于 2023-05-21  发布在  Java
关注(0)|答案(5)|浏览(284)

关于this SO问题,我有一个场景,我只需要匹配包含a-f的十六进制字符串。其他所有不应匹配。示例:

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

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

p5fdfcr1

p5fdfcr11#

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

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

xfyts7mz

xfyts7mz2#

我需要一个只匹配mongodb ObjectID的正则表达式
如果你需要,你必须准确地指定组成mongodb ObjectID的内容,这样我们就可以为它创建合适的正则表达式字符串。
这在技术上应该在js中工作:

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

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

js4nwp543#

从技术上讲,问题中的所有示例都可能是有效的ObjectId。如果您必须添加一些额外的验证,并且regexp还不够,那么我的建议是检查前4个字节是否是有效的时间戳。您甚至可以验证ObjectId是否已在某个时间段内生成(例如因为你的项目已经开始了)。详情请参见ObjectId documentation
如果对象中有另一个时间戳字段,那么也可以确保两个时间非常接近。
仅供参考,在MongoDB shell中,ObjectId::getTimestamp()方法可用于从ObjectId中提取时间戳。

u91tlkcl

u91tlkcl4#

我会做这样的事

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
cygmwpex

cygmwpex5#

对于那些正在寻找十六进制检查字符串的人:

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

相关问题