2017-02-14 3 views
1

In other posts объясняют, как сопоставить идентификатор объекта MongoDB через регулярное выражение. Я смотрю обратное: задано строка, регулярное выражение, которое возвращает положительное, если оно не действительный идентификатор объекта mongo. Другими словами, я хочу совместить все, что не является идентификатором объекта mongodb.Соответствующие строки регулярных выражений, которые не являются действительными идентификаторами mongo

Я полагаю, что это должно быть так же просто, как отрицать (?!) Регулярное выражение, но я не в состоянии сделать это правильно.

Регулярное выражение должно работать в Javascript и Python3 (это могут быть два разных регулярных выражения). Я могу принять небольшую потерю точности, если это необходимо, и строка может иметь пространство, но не символы новой строки.

Например, полное имя (James Bond) должны соответствовать положительным, но не (45cbc4a0e4123f6920000002)

More about Mongodb object Ids.

Спасибо :-)

ответ

0

Это может быть это:

const isNotMongoObject = id => !/^(?=[a-f\d]{24}$)(\d+[a-f]|[a-f]+\d)/i.test(id) 
 

 
const testIds = [" James Bond ", "45cbc4a0e4123f6920000002", "112345679065574883030833", "FFFFFFFFFFFFFFFFFFFFFFFF", "45cbc4a0e4123f6920000002", ` James 
 
Bond `] 
 
for (const id of testIds) { 
 
    console.log(`${id} ${isNotMongoObject(id)}`) 
 
}

def isNotMongoObject id: 
    return re.match(r"^(?=[a-f\d]{24}$)(\d+[a-f]|[a-f]+\d)", id) is not None 
0

В языке регулярных выражений, будет противоположной:

^(?!(?=[a-f\d]{24}$)(\d+[a-f]|[a-f]+\d)).+ 

Который дает следующие результаты:

112345679065574883030833 => true 
FFFFFFFFFFFFFFFFFFFFFFFF => true 
45cbc4a0e4123f6920000002 => false (ie a mongo id) 
112345679065574883030833 => true 
James Bond => true 

См a demo on regex101.com.
Другой способ (лучше?) Должен был бы доказать, что - - идентификатор Mongo, а затем программно программно проверьте отрицание.