ng-pattern与脚本验证

时间:2015-08-04 05:59:01

标签: javascript regex angularjs

我正在使用正则表达式ng-pattern验证日期(格式为YYYY / MM / DD)。当我在UI中使用下面的代码时,它工作正常。

<input type="text" class="k-fill" ng-pattern="/((^[1]{1}[9]{1}[9]{1}\d{1})|([2-9]{1}\d{3}))\/([0]{1}[1-9]{1}|[1]{1}[0-2]{1})\/([0]{1}[1-9]{1}|[1,2]{1}\d{1}|[3]{1}[0,1]{1})$/" ng-model="Request.ExpDate" id="ExceptedDate" name="ExceptedDate" ng-readonly="true" required />

但我想验证函数内部的模式以弹出验证消息。为了实现它,我在我的一个js文件中使用了下面的代码。

 var str = Request.ExpDate;
        var x = '/((^[1]{1}[9]{1}[9]{1}\d{1})|([2-9]{1}\d{3}))\/([0]{1}[1-9]{1}|[1]{1}[0-2]{1})\/([0]{1}[1-9]{1}|[1,2]{1}\d{1}|[3]{1}[0,1]{1})$/';
        var patt = new RegExp(x);
        var res = patt.test(str); 

如果 res 返回false,我可以显示一条消息。但问题是,对于每个甚至是正确格式的日期,它都会返回false。

我是否知道为什么regexp在ng-pattern中工作正常以及为什么它在JS函数中无法正常工作?

1 个答案:

答案 0 :(得分:1)

您的正则表达式始终返回false,因为您在使用构造函数表示法(new RegExp(var))初始化的模式中包含了正则表达式分隔符。

您不必使用构造函数,并且可以使用RegExp形式的常规文字初始化/.../

var str = Request.ExpDate;
var patt = /((^[1]{1}[9]{1}[9]{1}\d{1})|([2-9]{1}\d{3}))\/([0]{1}[1-9]{1}|[1]{1}[0-2]{1})\/([0]{1}[1-9]{1}|[1,2]{1}\d{1}|[3]{1}[0,1]{1})$/;
var res = patt.test(str);

但是,你的正则表达式似乎有一些问题,这是一个固定的版本:

/^((199\d)|([2-9]\d{3}))\/(0[1-9]|1[0-2])\/(0[1-9]|[12]\d|3[01])$/

我删除了{1}限制量词,因为它是多余的,并且从字符类,[1,2]中删除[0,1],因为逗号被视为文字,并且可能搞砸了结果。我们还可以通过删除不必要的组或将其转换为非捕获组来进一步增强,但这些已经是整容变化。

见样本:

&#13;
&#13;
var str = "2992/10/31";
var patt = /^((199\d)|([2-9]\d{3}))\/(0[1-9]|1[0-2])\/(0[1-9]|[12]\d|3[01])$/;
var res = patt.test(str);
document.write(res);
&#13;
&#13;
&#13;

请注意,您还可以使用Date.Parse更准确地验证日期。