在日期正则表达式中允许正则表达式中正好允许两个点或没有



我有以下正则表达式,它应该匹配德语格式的日期(dd.mm.yyyy(

^((0(?!0))?[1-9]|[12][0-9]|3[01]).((0(?!0))?[1-9]|1[0-2]).([12][0-9]{3}|[0-9]{2})$/gm

点应该是可选的,但用户应该同时输入两者或不输入。

所以:

01.01.2000 => ok
01012000 => ok
01.012000 => nok
0101.2000 => nok

我试着摆弄环顾四周的表情,但我没有找到一个可行的解决方案。

您可以捕获组中的点并将其设置为可选。要匹配第二个点,您可以使用对组中捕获的内容使用第一个可选点的反向引用。

更新模式,反向引用将是组 3:

^((0(?!0))?[1-9]|[12][0-9]|3[01])(.?)((0(?!0))?[1-9]|1[0-2])3([12][0-9]{3}|[0-9]{2})$
^^^^^                       ^^

正则表达式演示

请注意,有很多捕获组。如果在处理后不需要它们,也可以使用非捕获组代替(?:

如果只有一个捕获组用于反向引用,则模式可能如下所示:

^(?:0?[1-9]|[12][0-9]|3[01])(.?)(?:0?[1-9]|1[0-2])1(?:[12][0-9]{3}|[0-9]{2})$

正则表达式演示

这部分^((0(?!0))?[1-9]将不匹配00,因为字符类[1-9]不匹配零。

如果要匹配可选的零,可以使用0?[1-9]

最新更新