我有以下正则表达式,它应该匹配德语格式的日期(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]