Подтвердить что ты не робот

Regex для ObjectID объекта MongoDB

Что касается вопроса this SO, у меня есть сценарий, где мне нужно только совместить шестнадцатеричную строку с включенным a-f. Все остальное не должно совпадать. Пример:

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

Моим вариантом использования является то, что я работаю с набором шестнадцатеричных строк и хотел бы только утверждать как истинные те, которые являются идентификаторами объекта mongodb.

4b9b3361

Ответ 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