使用相同模式

时间:2017-11-10 18:51:55

标签: javascript

我想验证格式为" dd / mm / yyyy"的两个日期字段。但是第二次约会的验证总是错误的。

var pattern = /\d{2}\/\d{2}\/\d{4}/gi;

if (pattern.test(date1) && pattern.test(date2)) {
       //Do something
   } 

我在Chrome和控制台中尝试过 这些是结果。为什么没有正确验证?

var pattern= /\d{2}\/\d{2}\/\d{4}/gi
pattern.test("21/12/2008");
true
pattern.test("21/12/2009");
false
pattern.test("21/12/2008");
true
pattern.test("21/12/2009");
false

1 个答案:

答案 0 :(得分:3)

如果您希望字符串日期:

var pattern = /^\d{2}\/\d{2}\/\d{4}$/;

如果您希望字符串包含日期:

var pattern = /\d{2}\/\d{2}\/\d{4}/;

什么没有用?

i不区分大小写,在搜索带有数字和/ s

的日期时毫无意义

g意味着全球化,这对我们的正则表达式有着有趣的影响......

尝试在控制台中运行此示例:

var pattern = /\d{2}\/\d{2}\/\d{4}/gi;
pattern.test("21/12/2009");
true
pattern.test("21/12/2008");
false
pattern.test("21/12/2008");
true
pattern.test("21/12/2009");
false
pattern.test("21/12/2009");
true
pattern.test("21/12/2009");
false

请注意,我们发送给测试的内容没有任何影响,它只是翻转错误。

这是因为当使用g标志时,javascripts正则表达式引擎是不纯的。它使状态从测试到测试。从这个问题:Interesting test of Javascript RegExp

  

当你在JS RegExp上使用全局标志时," test"和" exec"方法每次在第一次匹配时停止但保留指向它们停止在字符串中搜索的位置的指针。可以在lastIndex属性上检查该指针。当你打电话"测试"或者" exec"再次开始搜索从lastIndex开始的匹配。

     

因此,当您在与整个字符串匹配的字符串上测试RegExp时,lastIndex将设置为字符串的结尾。下次测试时,从字符串末尾开始,返回false,并将lastIndex设置为零。

我们可以从上面的代码示例中继续看到这种行为:

pattern.test("21/12/2009");
true
pattern.lastIndex
10
pattern.test("21/12/2009");
false
pattern.lastIndex
0
pattern.test("21/12/2009");
true