例如,我有一个字段为NameRegex的JSON:
{
"NameRegex": ".*abc+"
}
用户不断忘记“。”在“ *”之前或犯类似的错误。是否可以使用json模式验证此字段中指定的正则表达式的正确性?
答案 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
关键字仍然是一个好主意,因为即使您的特定验证器不验证格式,至少也可以很好地证明您打算使用该属性。