Regex для ObjectID объекта MongoDB
Что касается вопроса this SO, у меня есть сценарий, где мне нужно только совместить шестнадцатеричную строку с включенным a-f. Все остальное не должно совпадать. Пример:
checkForHexRegExp.test("112345679065574883030833"); // => false
checkForHexRegExp.test("FFFFFFFFFFFFFFFFFFFFFFFF"); // => false
checkForHexRegExp.test("45cbc4a0e4123f6920000002"); // => true
Моим вариантом использования является то, что я работаю с набором шестнадцатеричных строк и хотел бы только утверждать как истинные те, которые являются идентификаторами объекта mongodb.
Ответы
Ответ 1
Вы можете использовать следующее регулярное выражение , но оно не будет работать
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
, потому что он передает все вышеперечисленные тесты
Ответ 2
Технически, все примеры в вопросе потенциально могут быть действительными ObjectIds. Если вам нужно добавить дополнительную проверку и что regexp недостаточно, то мое предложение - проверить, являются ли первые 4 байта допустимой меткой времени. Вы даже можете убедиться, что ObjectId был сгенерирован в течение определенного периода времени (например, с момента запуска вашего проекта). Подробнее см. документацию ObjectId.
Если в объекте есть другое поле метки времени, тогда также можно убедиться, что оба момента действительно близки.
Только для справки, в оболочке MongoDB ObjectId:: getTimestamp() метод может быть использован для извлечения метки времени из ObjectId.
Ответ 3
Мне нужно регулярное выражение, которое будет соответствовать только идентификаторам объекта mongodb
Если вам это нужно, вам нужно будет точно указать, что составляет идентификатор объекта mongodb, чтобы мы могли создать для него соответствующую строку регулярного выражения.
Это должно технически работать в js:
var myregexp = /^[0-9a-fA-F]{24}$/;
subject = "112345679065574883030833";
if (subject.match(myregexp)) {
// Successful match
} else {
// Match attempt failed
}
Ответ 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