检查模式是否不匹配

时间:2013-07-16 22:37:14

标签: javascript regex validation regula

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)) {
     ...
}

我怎样才能在Regula中做到这一点?

1 个答案:

答案 0 :(得分:2)

有几种方法可以做到这一点。对于您的情况,您可以使用否定前瞻:

<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用于正则表达式标志。这也是内置验证器的正确反转。

编辑:我认为向@Pattern添加可选参数可能很有用,这样您就可以反转模式。所以基本上(假设这个功能已经实现)你只需这样做:

<input type="text" id="categoryId" data-constraints="@Pattern(regex=/[0-9]-[A-Z]{3}-[0-9]{4}/, invert=true)" />

我会把它放在我要做的事情清单上。