所以我有一个日期字段(年月日)
^((d{4}|d{2})[-/](0?[1-9]|[12][0-9]|3[01])[-/])(0?[1-9]|1[012])$
和
(YYYY/MM/DD)
^(d{4}|d{2})[-/](0?[1-9]|1[012])[-/](0?[1-9]|[12][0-9]|3[01]))$
我想知道我是否可以使DD和MM部件可以互换,这样我就不用分别表示它们了。我知道我可以在YYYY之后使用OR函数,但我真的希望有一个可以以最短的模式捕获两种格式的正则表达式。
最简单的方法是将regex1和regex2放在一起,像这样:
regex1|regex2
然后,您可以提取相互的"前缀"one_answers"后缀"。在你的例子中:
^(d{4}|d{2})[-/]
和$
这里我使用?|
分支复位:
^(d{4}|d{2})[-/](?|(0?[1-9]|[12][0-9]|3[01])[-/](0?[1-9]|1[012])$|(0?[1-9]|1[012])[-/](0?[1-9]|[12][0-9]|3[01]))$
假设d
与[0-9]
相同,您可以将其缩短一点:
^(d{4}|d{2})[-/](?|(0?[1-9]|[12]d|3[01])[-/](0?d|1[012])$|(0?[1-9]|1[012])[-/](0?[1-9]|[12]d|3[01]))$
这与您的原始正则表达式最接近。
另一方面,您可能希望放弃一些验证。与日期匹配的部分也将与所有月份匹配。
这个正则表达式:
^(d{4}|d{2})[-/](0?[1-9]|[12][0-9]|3[01])[-/](0?[1-9]|[12][0-9]|3[01])$
如果您不关心捕获组(因为在[-/]
上分割是微不足道的),您可以使用:
^(d{4}|d{2})([-/](0?[1-9]|[12][0-9]|3[01])){2}$
它将匹配旧正则所匹配的所有内容。缺点是它也匹配"日期",如:
2000/31/30
当然,最短的正则表达式(在合理范围内;否则是.*
)将会是这样的:
^(d{2}){1,2}([-/]d{1,2}){2}$