Как проверить поле регулярных выражений, используя схему JSON - PullRequest
0 голосов
/ 25 февраля 2019

Например, у меня есть JSON с полем NameRegex:

{
   "NameRegex": ".*abc+"
}

пользователи постоянно забывают "."перед "*" или делать подобные ошибки.Можно ли проверить правильность регулярного выражения, указанного в этом поле, используя схему json?

Ответы [ 3 ]

0 голосов
/ 25 февраля 2019

Я не думаю, что вы можете сделать это, используя схему JSON, но вы можете сделать это в коде, подключившись к процессу десериализации.Там вы убедитесь, что строка NameRegex является допустимым регулярным выражением, попытавшись создать из него объект Regex, и сгенерирует исключение, если оно недопустимо.

Для этого создайте метод проверки, который принимает StreamingContext в целевом классе, и украсьте его атрибутом [OnDeserialized].Напишите свой проверочный код в этом методе.Например:

public class Foo
{
  public string NameRegex { get; set; }

  [OnDeserialized]
  internal void OnDeserializedMethod(StreamingContext context)
  {
    try
    {
      //ensure NameRegex is a valid regex
      var r = new Regex(NameRegex);
    }
    catch
    {
      //throw whatever exception is appropriate for you
      throw new InvalidDataException(
         $"'{NameRegex}' is not a valid regular expression.");
    }
  }  
}

Десериализация вызовет исключение, которое вы определили, если проверка не удалась:

var foo = JsonConvert.DeserializeObject(
  @"{""NameRegex"":""abc+""}",
  typeof(Foo));

**** Значение NameRegex '* abc +' не является допустимым регулярным выражением ****

0 голосов
/ 26 февраля 2019

JSON-схема имеет ключевое слово аннотации format, которое также проверяют некоторые валидаторы (это необязательно для спецификации).

Так что вы можете сказать:

{
    "type": "object",
    "properties": {
        "NameRegex": {
            "type": "string",
            "format": "regex"
        }
    }
}

, но это не обязательнодля валидаторов для проверки "форматирования" ключевых слов.И, как упоминал Грег, часто регулярное выражение остается в силе, даже если вы опускаете точку перед *;он просто имеет другое значение (повторение любого символа, который был перед звездой, а не какого-либо символа, ноль или более раз)

Хотя по-прежнему неплохо использовать ключевое слово format, как минимумЭто хорошая документация вашего намерения в отношении имущества, даже если ваш конкретный валидатор не проверяет форматы.

0 голосов
/ 25 февраля 2019

К сожалению, нет хорошего способа проверки регулярного выражения, поскольку почти любая строка (даже этот ответ) может быть допустимым регулярным выражением.Даже если у вас есть хороший способ проверки правильности регулярных выражений, он будет основан на реализации и не будет соответствовать требованиям схемы JSON.Моя реализация (в .Net), например, переводит обработку регулярных выражений в класс Regex.Если это не удастся, вы получите исключение во время выполнения.

Лучшее, что вы можете реально сделать, это тщательно протестировать свое регулярное выражение перед развертыванием в производство.

Вот пара хороших сайтов тестирования:

Есть и много других.

...