ng-pattern Vs脚本验证

ng-pattern Vs script validation

本文关键字:验证 脚本 Vs ng-pattern      更新时间:2023-09-26

我正在使用正则表达式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模式下工作良好,为什么它在JS函数内不能正常工作的原因吗?

您的regex一直返回false,因为您在使用构造函数符号(new RegExp(var))初始化的模式中包含了regex分隔符。

您不必使用构造函数,并且可以使用/.../:

形式的常规文字初始化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]中删除了,,因为逗号被视为文字,可能会弄乱结果。我们还可以通过删除不必要的组或将其转为非捕获来进一步增强,但这些已经是表面上的更改。

见样例:

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);

注意,您也可以使用Date.Parse来更精确地验证日期。