我正在使用正则表达式ng-模式验证日期(格式为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,我可以显示一条消息。但问题是,它是返回错误的每一个日期,即使是以正确的格式。
我可以知道为什么regexp在ng模式下工作得很好,为什么它在JS函数中不能正常工作吗?
发布于 2015-08-04 06:19:00
正则表达式总是返回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);但是,您的regex似乎存在一些问题,下面是一个固定的版本:
/^((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更精确地验证日期。
https://stackoverflow.com/questions/31801703
复制相似问题