如何使用JSON模式验证正则表达式字段

时间:2019-02-25 10:56:37

标签: .net json jsonschema

例如,我有一个字段为NameRegex的JSON:

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

用户不断忘记“。”在“ *”之前或犯类似的错误。是否可以使用json模式验证此字段中指定的正则表达式的正确性?

3 个答案:

答案 0 :(得分:0)

不幸的是,没有验证正则表达式的好方法,因为几乎任何字符串(甚至是答案)都可以是有效的正则表达式。即使您有一个好的方法,正则表达式验证也将基于实现,并且与JSON Schema的要求脱节。例如,我的实现(在.Net中)将正则表达式处理委托给Regex类。如果失败,那么您将获得运行时异常。

实际上,您可以做的最好的事情就是在部署到生产环境之前,对正则表达式进行广泛的测试。

这里有几个不错的测试站点:

还有很多其他的东西。

答案 1 :(得分:0)

我认为您无法使用JSON模式执行此操作,但是您可以通过加入反序列化过程来在代码中执行操作。在那里,您将尝试通过从中构造一个Regex对象来验证NameRegex字符串是否为有效的正则表达式,如果无效则抛出异常。

要执行此操作,请创建一个在目标类中采用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 +'不是有效的正则表达式****

答案 2 :(得分:0)

JSON模式具有注释关键字format,一些验证程序也对此注释进行了验证(根据规范,这是可选的)。

所以你可以说:

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

,但验证者不需要验证“格式”关键字。正如Greg所提到的,即使您省略*前面的点,该正则表达式通常仍然有效。它只是具有不同的含义(重复出现在星前的任何字符,而不是重复零次或多次的任何字符)

尽管如此,使用format关键字仍然是一个好主意,因为即使您的特定验证器不验证格式,至少也可以很好地证明您打算使用该属性。