参考这个 SO问题,我有一个场景,我只需要匹配包含af的十六进制字符串.其他一切都不匹配.例:
checkForHexRegExp.test("112345679065574883030833"); // => false checkForHexRegExp.test("FFFFFFFFFFFFFFFFFFFFFFFF"); // => false checkForHexRegExp.test("45cbc4a0e4123f6920000002"); // => true
我的用例是我正在使用一组十六进制字符串,并且只想验证那些是mongodb objectID的真实.
您可以使用以下正则表达式,但它不会很有效
checkForHexRegExp = /^(?=[a-f\d]{24}$)(\d+[a-f]|[a-f]+\d)/i
例:
> checkForHexRegExp.test("112345679065574883030833") false > checkForHexRegExp.test("FFFFFFFFFFFFFFFFFFFFFFFF") false > checkForHexRegExp.test("45cbc4a0e4123f6920000002") true
但是,正如我评论,112345679065574883030833
,FFFFFFFFFFFFFFFFFFFFFFFF
也是有效的十六进制表示.
您应该使用, /^[a-f\d]{24}$/i
因为它通过了所有上述测试
从技术上讲,问题中的所有示例都可能是有效的ObjectIds.如果你必须添加一些额外的验证并且regexp是不够的,那么我的建议是检查前4个字节是否是有效的时间戳.您甚至可以验证ObjectId是否在特定时间段内生成(例如,因为您的项目已经启动等).有关详细信息,请参见ObjectId文档.
如果对象中有另一个时间戳字段,那么也可以确保两个时间都非常接近.
仅供参考,在MongoDB shell中,ObjectId :: getTimestamp()方法可用于从ObjectId中提取时间戳.