混淆正则表达式重复部分

Confusing with Regular Expressions repeaing parts

本文关键字:复部 正则表达式      更新时间:2023-09-26

我真的很困惑正则表达式重复部分与花括号。考虑下面的例子:

var dateTime = /'d{1,2}'/'d{1,2}'/'d{4} 'd{1,2}:'d{2}/;
console.log(dateTime.test("30/1/2003 8:45"));
// true

现在如果我将30改为300000,将45改为455555,我将再次得到true !外部数之间的其他部分没有问题,结果与预期一致。

谁能帮我找出问题所在吗?

谢谢。

你没有匹配字符串 (^$)的开始和结束,所以它只是在字符串的任何地方找到匹配,这仍然发生,然后给出true。

300000/1/2003 8:455555
    dd/m/yyyy h:mm

你可能想要

/^'d{1,2}'/'d{1,2}'/'d{4} 'd{1,2}:'d{2}$/;

或者更确切地说;

/^(?:0?[1-9]|[12]'d|3[01])'/(?:0?[1-9]|1[0-2])'/'d{4} (?:0?'d|1'd|2[0-3]):[0-5]'d$/;
  • (?:pattern)非捕获组
  • pattern? pattern中的n是可选的
  • [1-9]字符类;1 ~ 9
  • pattern1|pattern2pattern1pattern2
  • [12]字符;12
  • 'd[0-9]相同
  • pattern{4} npattern中出现4

您没有匹配整个字符串,只是其中的一部分-使用test函数,这足以返回True

试试这个:

/^'d{1,2}'/'d{1,2}'/'d{4} 'd{1,2}:'d{2}$/

^锚匹配字符串的开头,$锚匹配字符串的结尾。

您可以通过使用string.match(regex)而不是regex.test(string)找到更多关于匹配的有用信息。

在本例中,您将看到它匹配00/1/2003 8:45,因为您没有使用^$分别标记主题字符串的开始和结束。

发生的情况是,当您将30更改为30000时,将匹配30000的最后两个零(00),而对于45555,匹配将在前两个数字(45)停止,并且字符串的其余部分不匹配。

为了防止这种情况发生,您必须指出字符串必须以指定的regex开始和结束。
这可以使用anchors来完成。
像这样-

var dateTime = /^'d{1,2}'/'d{1,2}'/'d{4} 'd{1,2}:'d{2}$/;
                ^                                     ^