可互换的正则表达式字段



所以我有一个日期字段(年月日)

^((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}$

最新更新