[(再次)编辑以改进格式并修复简介。]
这是一个评论和一个答案。
答案部分......我确实同意亚历克斯之前的回答。
(?: )
,与( )
,用于避免捕获文本,通常是为了减少与您确实想要的内容一起抛出的反向引用或提高速度性能。
这 ?遵循(?: )
-- 或者当遵循除以下内容之外的任何内容时* + ?
or {}
-- 表示前面的项目可能会也可能不会在合法匹配中找到。例如,/z34?/
将匹配 z3 和 z34,但不会匹配 z35 或 z 等。
评论部分...我对您正在处理的正则表达式进行了可能被认为是改进的内容:
(?:^|\s)(0?[1-9]|[1-2][0-9]|30|31)-(0?[1-9]|10|11|12)-((?:20)?[0-9][0-9])(?:\s|$)
-- 首先,它避免了诸如 0-0-2011 之类的事情
-- 其次,它避免了诸如 233443-4-201154564 之类的事情
-- 第三,包括诸如 1-1-2022 之类的内容
-- 第四,它包括诸如 1-1-11 之类的内容
-- 第五,它避免了像 34-4-11 这样的事情
-- 第六,它允许您捕获日、月和年,以便您可以在代码中更轻松地引用这些内容。例如,可以执行进一步检查的代码(是第二个捕获的组 2,并且是首先捕获组 29 并且这是闰年,否则第一个捕获组
最后,请注意,您仍然会得到不存在的日期,例如 31-6-11。如果您想避免这些,请尝试:
(?:^|\s)(?:(?:(0?[1-9]|[1-2][0-9]|30|31)-(0?[13578]|10|12))|(?:(0?[1-9]|[1-2][0-9]|30)-(0?[469]|11))|(?:(0?[1-9]|[1-2][0-9])-(0?2)))-((?:20)?[0-9][0-9])(?:\s|$)
另外,我假设日期前面和后面都有一个空格(或行尾),但您可能需要调整它(例如,允许使用标点符号)。
其他地方的评论者引用了此资源,您可能会发现它有用:http://rubular.com/ http://rubular.com/