在Regula中,如何获得与模式不匹配的约束?我可以这样使用@Pattern
:
<input type="text" id="categoryId" data-constraints="@Pattern(regex=/[0-9]-[A-Z]{3}-[0-9]{4}/)" />
但假设/[0-9]-[A-Z]{3}-[0-9]{4}/
是一个"坏"模式,我想允许他们输入任何与该模式不匹配的。
在常规JavaScript中,我可以做:
if(!/[0-9]-[A-Z]{3}-[0-9]{4}/.test(value)) {
...
}
在雷古拉我该怎么做?
有几种方法可以做到这一点。对于您的情况,您可以使用负面展望:
<input type="text" id="categoryId" data-constraints="@Pattern(regex=/^(?!.*[0-9]-[A-Z]{3}-[0-9]{4})/)" />
我不确定这对于更复杂的正则表达式是如何工作的,但如果是这样的话,我想你可以创建一个自定义约束:
regula.custom({
name: "NotPattern",
params: ["regex"],
defaultMessage: "The value must not match {regex}.",
validator: function(params) {
var regex = new RegExp(params["regex"]);
return !regex.test(this.value);
}
});
您甚至可以在验证器功能中使用内置的@Pattern
验证器,如下所示:
regula.custom({
name: "NotPattern",
params: ["regex"],
defaultMessage: "The value must not match {regex}.",
validator: function(params, validator) {
return !validator.pattern(this, params);
}
});
然后你可以在你的输入元素中使用它,比如:
<input type="text" id="categoryId" data-constraints="@NotPattern(regex=/[0-9]-[A-Z]{3}-[0-9]{4}/)" />
我建议使用第二种方法,因为您可以传入内置的@Pattern
验证器支持的参数,比如用于正则表达式标志的flags
。这也是一个适当的反向内置验证器。
EDIT:我认为在@Pattern
中添加一个可选参数可能会很有用,这样您就可以反转模式。所以基本上(假设这个功能已经实现),你所要做的就是:
<input type="text" id="categoryId" data-constraints="@Pattern(regex=/[0-9]-[A-Z]{3}-[0-9]{4}/, invert=true)" />
我会把它放在我要做的事情清单上。