我登陆这里是因为这个问题的标题很宽泛,我一直在寻找可用于匹配特定日期格式(例如OP)的正则表达式。 但是我随后发现,正如许多答案和评论已全面突出显示的那样,在提取与质量低劣或非结构化源数据混在一起的日期时,存在许多陷阱使构建有效模式变得非常棘手。

在探索问题时,我想出了一个系统,使您可以通过将四个在分隔符上匹配的更简单的子表达式以及顺序中的年,月和日字段的有效范围排列在一起,来构建正则表达式 您需要。

这些是 :-

定界符

[^\w\d\r\n:]

这将匹配不是单词字符,数字字符,回车符,换行符或冒号的任何内容。 冒号必须存在,以防止在日期类似的时间匹配(请参阅我的测试数据)

您可以优化模式的这一部分以加快匹配速度,但这是检测大多数有效定界符的良好基础。

注意; 它将匹配带有混合定界符(例如2 / 12-73)的字符串,该定界符可能实际上不是有效日期。

年值

(\d{4}|\d{2})

这与两位或四位数字匹配,在大多数情况下是可以接受的,但是如果您要处理的是0-999年或9999年以后的数据,则需要决定如何处理,因为在大多数情况下为1,3 或> 4位数字的年份是垃圾。

月值

(0?[1-9]|1[0-2])

匹配1到12之间的任何数字,带或不带前导零-注意:0和00不匹配。

日期值

(0?[1-9]|[12]\d|30|31)

匹配1到31之间的任何数字,带或不带前导零-注意:0和00不匹配。

此表达式匹配日期,月份,年份格式的日期

(0?[1-9]|[12]\d|30|31)[^\w\d\r\n:](0?[1-9]|1[0-2])[^\w\d\r\n:](\d{4}|\d{2})

但它也可以匹配某些年,月日期。 还应与边界运算符一起进行预订,以确保选择了整个日期字符串,并防止从格式不正确的数据(即没有边界标签的数据中提取有效的子日期)匹配20/12/194和20/12/19以及 101/12/1974比赛为01/12/1974

将下一个表达式的结果与上一个表达式的结果与废话部分中的测试数据进行比较(如下)

\b(0?[1-9]|[12]\d|30|31)[^\w\d\r\n:](0?[1-9]|1[0-2])[^\w\d\r\n:](\d{4}|\d{2})\b

此正则表达式没有验证,因此将匹配格式正确但无效的日期(例如31/02/2001)。 那是一个数据质量问题,正如其他人所说的,您的正则表达式不需要验证数据。

因为您(作为开发人员)不能保证源数据的质量,所以您确实需要执行和处理代码中的其他验证,因此,如果尝试匹配和验证RegEx中的数据,它将变得非常混乱,并且变得很难 没有非常简洁的文档支持。

垃圾进垃圾出。

话虽如此,如果您确实有日期值各不相同的混合格式,则必须尽可能地提取; 您可以像这样将两个表达式组合在一起;

此(灾难性)表达式匹配DMY和YMD日期

(\b(0?[1-9]|[12]\d|30|31)[^\w\d\r\n:](0?[1-9]|1[0-2])[^\w\d\r\n:](\d{4}|\d{2})\b)|(\b(0?[1-9]|1[0-2])[^\w\d\r\n:](0?[1-9]|[12]\d|30|31)[^\w\d\r\n:](\d{4}|\d{2})\b)

但是您将无法确定1973年6月9日这样的日期是9月6日还是6月9日。 我正在努力思考这样一种情况,即该情况不会在某个地方造成问题,这是不好的做法,您不必这样处理-找到数据所有者并用治理锤来打击他们 。

最后,如果要匹配不带分隔符的YYYYMMDD字符串,则可以消除一些不确定性,表达式如下所示

\b(\d{4})(0[1-9]|1[0-2])(0[1-9]|[12]\d|30|31)\b

但请再次注意,它将匹配格式正确但无效的值,例如20010231(2月31日!):)

测试数据

在对该线程中的解决方案进行实验时,我最终得到了一个测试数据集,其中包含各种有效和无效日期,以及一些您可能希望或不希望匹配的棘手情况,例如,可以匹配为日期和日期的时间 多行。

我希望这对某人有用。

Valid Dates in various formats

Day, month, year

2/11/73

02/11/1973

2/1/73

02/01/73

31/1/1973

02/1/1973

31.1.2011

31-1-2001

29/2/1973

29/02/1976

03/06/2010

12/6/90

month, day, year

02/24/1975

06/19/66

03.31.1991

2.29.2003

02-29-55

03-13-55

03-13-1955

12\24\1974

12\30\1974

1\31\1974

03/31/2001

01/21/2001

12/13/2001

Match both DMY and MDY

12/12/1978

6/6/78

06/6/1978

6/06/1978

using whitespace as a delimiter

13 11 2001

11 13 2001

11 13 01

13 11 01

1 1 01

1 1 2001

Year Month Day order

76/02/02

1976/02/29

1976/2/13

76/09/31

YYYYMMDD sortable format

19741213

19750101

Valid dates before Epoch

12/1/10

12/01/660

12/01/00

12/01/0000

Valid date after 2038

01/01/2039

01/01/39

Valid date beyond the year 9999

01/01/10000

Dates with leading or trailing characters

12/31/21/

31/12/1921AD

31/12/1921.10:55

12/10/2016 8:26:00.39

wfuwdf12/11/74iuhwf

fwefew13/11/1974

01/12/1974vdwdfwe

01/01/99werwer

12321301/01/99

Times that look like dates

12:13:56

13:12:01

1:12:01PM

1:12:01 AM

Dates that runs across two lines

1/12/19

74

01/12/19

74/13/1946

31/12/20

08:13

Invalid, corrupted or nonsense dates

0/1/2001

1/0/2001

00/01/2100

01/0/2001

0101/2001

01/131/2001

31/31/2001

101/12/1974

56/56/56

00/00/0000

0/0/1999

12/01/0

12/10/-100

74/2/29

12/32/45

20/12/194

2/12-73

php正则表达式 匹配日期,正则表达式-正则表达式以匹配有效日期相关推荐

  1. python正则匹配日期2019-03-11_Python正则表达式匹配日期与时间的方法

    下面给大家介绍下Python正则表达式匹配日期与时间 #!/usr/bin/env python # -*- coding: utf-8 -*- __author__ = 'Randy' import ...

  2. java 匹配url的正则表达式_java匹配url的正则表达式

    展开全部 给你个正则表达式的资料,自己慢慢研究,授你以渔: 一.正则表达式基础知识 我们先从简单的开始.假设你62616964757a686964616fe78988e69d8331333264623 ...

  3. php 匹配多个正则表达式,PHP 正则表达式函数库(两套)

    PHP 正则表达式函数库(两套) 更新时间:2009年10月14日 17:20:57   作者: 正则表达式:用于描述字符排列和匹配模式的一种语法规则.它主要用于字符串的模式分割.匹配.查找及替换操作 ...

  4. java正则表达式 匹配次数_正则表达式教程之重复匹配详解

    本文实例讲述了正则表达式教程之重复匹配.分享给大家供大家参考,具体如下: 注:在所有例子中正则表达式匹配结果包含在源文本中的[和]之间,有的例子会使用Java来实现,如果是java本身正则表达式的用法 ...

  5. 正则表达式的贪婪和非贪婪匹配

    贪婪匹配:正则表达式一般趋向于最大长度匹配. 非贪婪匹配:匹配到结果就好. 默认是贪婪模式.在量词后面直接加一个问号?就是非贪婪模式. 量词:{m.n}:m到n个 *:任意多个(表示匹配0-无穷) + ...

  6. 转载:常用正则表达式大全!(例如:匹配中文、匹配html)

    常用正则表达式大全!(例如:匹配中文.匹配html) 匹配中文字符的正则表达式: [u4e00-u9fa5] 评注:匹配中文还真是个头疼的事,有了这个表达式就好办了 匹配双字节字符(包括汉字在内):[ ...

  7. python re正则匹配_python re正则表达式模块

    模块的的作用主要是用于字符串和文本处理,查找,搜索,替换等 复习一下基本的正则表达式吧 .:匹配除了换行符以为的任意单个字符 *:匹配任意字符,一个,零个,多个都能匹配得到 俗称贪婪模式 +:匹配位于 ...

  8. java中正则全局匹配_JS中正则表达式全局匹配模式/g用法实例

    JS中正则表达式全局匹配模式 /g用法详解 本文章来详细介绍js中正则表达式的全局匹配模式 /g用法, var str = "123#abc"; var re = /abc/ig; ...

  9. 匹配正则_Day233:正则表达式匹配方法 match()

    match()语法 match本身是JavaScript语言中字符串对象的一个方法,该方法的签名是 match([string] | [RegExp]) 它的参数既可以是一个字符串,也可以是一个正则表 ...

  10. PHP正则匹配效率,PHP 正则表达式效率 贪婪、非贪婪与回溯分析(推荐)

    先扫盲一下什么是正则表达式的贪婪,什么是非贪婪?或者说什么是匹配优先量词,什么是忽略优先量词? 好吧,我也不知道概念是什么,来举个例子吧. 某同学想过滤之间的内容,那是这么写正则以及程序的.$str ...

最新文章

  1. OpenStack七年盘点,热潮褪去后的明天在哪?
  2. mysql服务等待应答超时_MySQL-Communications link failure异常分析及解决方法
  3. Runtime----字典转模型
  4. css 识别变量中的换行符_Python编程 第二章——变量和简单数据类型
  5. javaScriptDay01
  6. 带有Java和Axis2的JSON Web服务
  7. css----实现checkbox图片切换
  8. python3.6安装pip3_python3安装pip3的实例步骤
  9. 安大计算机学院院长汤进,淮北师范大学
  10. IE浏览器中访问jsp页面,页面不执行ajax请求,后台控制台报错
  11. java utf8 简繁转换 类库_在Java中进行中文繁体简体转换,基于OpenCC(Open Chinese Convert)方案...
  12. 如何将div与页面的中间(水平/宽度)对齐[重复]
  13. java歌词高亮显示滚动_js如何处理音乐播放器的歌词文件达到高亮以及滚动的效果?...
  14. Atitit ocr的艺术 艾提拉著 目录 1. OCR可以说是一门非常“古老”的技术,在上世纪50年代到90年代, 1 1.1. 场景文字识别技术(Scene Text Recognition,
  15. 研大考研:只办最好的集训营
  16. 微信小程序学习笔记4
  17. shell基础知识及变量
  18. Toad oracle
  19. cf----2019-10-28(Sad powers,Zebras,Not simply beatiful strings)
  20. 面向交付的IT软件管理流程

热门文章

  1. TypeScript 的 type predicates
  2. 为加快SAP Commerce Cloud在windows服务器上的启动速度,而禁用的一些服务
  3. SAP Data Intelligence API执行出错的排错之道
  4. Check task status after 2016 Spring festival
  5. SAP UI5 sap.ui.core.OpenState.CLOSED Dialog open and close
  6. 解析word template返回使用的webservice WSDL和Operation
  7. Java servlet项目里的web.xml
  8. SAP CRM系统订单模型的设计与实现
  9. 如何在Kubernetes里创建一个Nginx应用
  10. wex5 php开发,WeX5平台PHP开发 使用说明文档