Регулярное выражение для сопоставления строки, которая не может содержать некоторые символы или подстроку

#regex #jsonschema

Вопрос:

Я пытаюсь добавить время маршрутизации (во время моделирования REST API) для проверки регулярных выражений для имени коллекции БД Mongo в соответствии со спецификацией БД Mongo (mongo 3.6).

Там написано (копирование вставки из приведенного выше документа):

 Restriction on Collection Names
Collection names should begin with 

 - an underscore or a letter character

and cannot:

 - contain the $.
 - be an empty string (e.g. "").
 - contain the null character.
 - begin with the system. prefix. (Reserved for internal use.)
 

Еще одно ограничение (вроде), которое у меня есть: оно предназначено для проверки схемы JSON в соответствии с подмножеством регулярного выражения, поддерживаемым схемой json. Это не полное регулярное выражение (например, я не могу использовать d, w (или я не могу использовать b<…>b).

С помощью этого, до сих пор, я могу выполнять другие части без

 - begin with the system. prefix. (Reserved for internal use.) 
 

Раздел.

Вот мое регулярное выражение на данный момент в моей схеме JSON API REST (см. Шаблон ниже):

 'collectionName': {
                description: "foo bar",
                type: 'string',
                minLength: 1,
                maxLength: 120,
                pattern: '(^[a-zA-Z0-9_][^$ \0]*$)',  <== this one.
                example: 'MyCollection',
            },
 

Для дальнейшего разъяснения приведем несколько примеров:

  1. Он не должен соответствовать чему-то вроде-коллекции, но должен соответствовать _коллекции или коллекции
  2. Жала содержит пробел или $ — не должно совпадать (например, коллекция, коллекция$$)
  3. Что-то вроде этого должно соответствовать: systemCollection
  4. Это не должно совпадать: system.collection // как система. префикс зарезервирован для Монго.

Изо всех сил стараюсь прояснить вопрос как можно лучше.

Любая помощь в этом отношении была бы весьма признательна.

Прадип

Комментарии:

1. Не могли бы вы уточнить, что работает не так, как ожидалось, пожалуйста? Я не вижу примера ввода, который, как вы ожидаете, не пройдет проверку, но это не так.

2. Все » — начните с системы. префикс.’ правило отсутствует в регулярном выражении. Означает: пункт № 4, который я назвал ранее, не должен совпадать. Пожалуйста, обратитесь к этому разделу: «Для дальнейшего разъяснения с помощью нескольких примеров».

Ответ №1:

Вам нужен негативный взгляд.

^(?!system.)[a-zA-Z0-9_][^$ \0]*$

(?!...) Начиная с текущей позиции в выражении, гарантирует, что данный шаблон не будет совпадать. Не использует символы. — regex101.com

Это то же самое в PCRE, что и в ECMAScript. MongoDB использует PCRE для своего регулярного выражения, поэтому я предполагаю, что то же самое верно для регулярного выражения внутри схемы JSON для MongoDB.

Вот пример работы с вашими тестовыми наборами образцов данных https://regex101.com/r/CHu6lz/1

Я рассмотрел только тот случай, с которого вы заявили, что не начинали system. . Вам нужно будет расширить регулярное выражение, чтобы добавить дополнительные случаи, но теперь, когда вы знаете об отрицательных образах, должно быть ясно, как это сделать.

Вам также нужно будет избежать регулярного выражения для использования в JSON, в соответствии с комментариями к этому ответу и как вы уже сделали.

Комментарии:

1. Ты совершенно прав. Я не охватил все варианты использования. Было бы проще, если бы ОП дал список «должен пройти» и «должен потерпеть неудачу», как я просил. Я обновлю свой ответ, чтобы показать, что это не полное решение.

2. Рад, что смог помочь. regex101.com это один из моих инструментов перехода к регулярным выражениям!

3. Действительно … это регулярное выражение 101 классно. Он даже показывает также группы совпадений (). Спасибо за указатель @Relequestual. Очень признателен.