在构建正则表达式时向字符串添加必需字符

时间:2016-10-07 15:12:17

标签: regex

我正在研究以下正则表达式:

  

^((199)[0-9] | 200 [0-9] | 201 [0-8])(0 [1-9] | 1 [0-2])(0 [1-9] | 1 \ d | 2 \ d |?3 [01])的 \ S [0-9] $

所以我有这个正则表达式,unbolded部分(空格前的前8个字符)工作正常。在第二部分(将是可选的),从我想要的空间开始:或。必填字符(至少一次)。

所以

19991019 will pass
19991019 1233 won't pass because does not include : or .
19991019 10:12:12 will passs
19991019 10.2.4 will pass
19991019123.1231.123 won't pass
19991019 aa.12.22 won't pass (because no letters are allowed)

2 个答案:

答案 0 :(得分:1)

您需要添加如下可选模式:

^(199[0-9]|200\d|201[0-8])(0[1-9]|1[0-2])(0[1-9]|1\d|2\d|3[01])(?:\s+(\d+(?:[.:]\d+)+))?$

请参阅regex demo

(?:\s+(\d+(?:[.:]\d+)+))?部分匹配1或0个序列:

  • \s+ - 一个或多个空格
  • (\d+(?:[.:]\d+)+) - 一个匹配的捕获组
    • \d+ - 一位或多位
    • (?:[.:]\d+)+ - 一个或多个.:序列后跟一个或多个数字

请注意,您可以使用{min,max}限制量词代替+进一步调整此值。比如说,要匹配1到3位数,您可以使用\d{1,3}

答案 1 :(得分:0)

试试这个正则表达式:

((199)[0-9]|200[0-9]|201[0-8])(0[1-9]|1[0-2])(0[1-9]|1\d|2\d|3[01]) (?:(?:\d+(?:\.|:|$)){1,4})?

最后一部分将接受模式{digits} {dot / colon / end of string} 4次(你可以调整它)。

另外我想提一下,我不了解整体用例(针对上述用例进行测试),可能需要进行一些调整。