可互换的正则表达式字段

时间:2016-09-28 16:41:42

标签: regex

所以我有一个日期字段(YYYY / DD / MM)

print len(allInOne), "bytes"
print len(allInOne) + allInOne.count('\n'), "bytes with 0A counted twice"

(YYYY / MM / DD)

^((\d{4}|\d{2})[-/](0?[1-9]|[12][0-9]|3[01])[-/])(0?[1-9]|1[012])$

我想知道我是否可以将DD和MM部件互换,以便我不单独代表它们。我知道我可以在YYYY之后使用OR函数,但我真的希望有一个能够以最短模式捕获这两种格式的正则表达式。

1 个答案:

答案 0 :(得分:0)

最简单的方法是使用regex1和regex2并将它们拼凑在一起:

regex1|regex2

然后,您可以提取相互"前缀"和"后缀"。在你的情况下:

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