通过.NET DateTime.Parse文化en-US的所有字符串的正则表达式

前端之家收集整理的这篇文章主要介绍了通过.NET DateTime.Parse文化en-US的所有字符串的正则表达式前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在你告诉我这是很多正则表达式之前 – 我知道.不要求任何人写任何正则表达式!你知道有人已经做过那个 Regex吗?

这将返回所有模式:CultureInfo.CurrentCulture.DateTimeFormat.GetAllDateTimePatterns()
但是这个列表不是100%准确.有些模式不解析(yy / mm / dd)和一些未解析的模式.参考en-US通用DateTime.Parse

我所做的是分解模式并尝试为每个模式编写正则表达式.

(^|\s)(3[01]|[12]\d|0?[1-9])\s+(January|February|March|April|May|June|July|August|September|October|November|December),\s?(19|20)?\d\d(\s+(0?\d|1\d|2[0-4]):[0-6]\d(:[0-6]\d)?(\s+([AP]M|GMT|[+-]\d\d:?\d\d))?)?
        //dd MMMM,yyyy                dddd,dd MMMM,yyyy
        //dd MMMM,yyyy h:mm tt        dddd,yyyy h:mm tt
        //dd MMMM,yyyy hh:mm tt       dddd,yyyy h:mm:ss tt
        //dd MMMM,yyyy h:mm:ss tt     dddd,yyyy hh:mm tt
        //dd MMMM,yyyy hh:mm:ss tt    dddd,yyyy hh:mm:ss tt
        //dd MMMM,yyyy H:mm           dddd,yyyy H:mm
        //dd MMMM,yyyy HH:mm          dddd,yyyy HH:mm
        //dd MMMM,yyyy H:mm:ss        dddd,yyyy H:mm:ss
        //dd MMMM,yyyy HH:mm:ss       dddd,yyyy HH:mm:ss

(^|\s)(3[01]|[12]\d|0?[1-9])(/|-)(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)(/|-)\d\d(\s+(0?\d|1\d|2[0-4]):[0-6]\d(:[0-6]\d)?(\s+([AP]M|GMT|[+-]\d\d:?\d\d))?)?
        //dd-MMM-yy 
        //dd-MMM-yy h:mm tt 
        //dd-MMM-yy h:mm:ss tt  
        //dd-MMM-yy hh:mm tt    
        //dd-MMM-yy hh:mm:ss tt 
        //dd-MMM-yy H:mm    
        //dd-MMM-yy HH:mm   
        //dd-MMM-yy H:mm:ss 
        //dd-MMM-yy HH:mm:ss

(^|\s)(January|February|March|April|May|June|July|August|September|October|November|December)\s(3[01]|[12]\d|0?[1-9])(,\s?|\s)(19|20)?\d\d(\s+(0?\d|1\d|2[0-4]):[0-6]\d(:[0-6]\d)?(\s+([AP]M|GMT|[+-]\d\d:?\d\d))?)?
        //MMMM dd,yyyy             dddd,MMMM dd,yyyy
        //MMMM dd,yyyy h:mm tt     dddd,yyyy h:mm tt
        //MMMM dd,yyyy h:mm:ss tt  dddd,yyyy h:mm:ss tt
        //MMMM dd,yyyy hh:mm tt    dddd,yyyy hh:mm tt
        //MMMM dd,yyyy hh:mm:ss tt dddd,yyyy hh:mm:ss tt
        //MMMM dd,yyyy H:mm        dddd,yyyy HH:mm       
        //MMMM dd,yyyy H:mm:ss     dddd,yyyy H:mm:ss     
        //MMMM dd,yyyy HH:mm       dddd,yyyy HH:mm:ss        
        //MMMM dd,yyyy HH:mm:ss

(^|\s)(19|20)\d\d(/|-)(1[0-2]|0?\d)(/|-)(3[01]|[12]\d|0?[1-9])(\s+(0?\d|1\d|2[0-4]):[0-6]\d(:[0-6]\d)?(\s+([AP]M|GMT|[+-]\d\d:?\d\d))?)?
        /yy/MM/dd   yyyy-MM-dd      
        //yy/MM/dd h:mm tt      yyyy-MM-dd h:mm tt      
        //yy/MM/dd hh:mm tt     yyyy-MM-dd hh:mm tt     
        //yy/MM/dd h:mm:ss tt   yyyy-MM-dd h:mm:ss tt       
        //yy/MM/dd hh:mm:ss tt  yyyy-MM-dd hh:mm:ss tt      
        //yy/MM/dd H:mm         yyyy-MM-dd H:mm     
        //yy/MM/dd HH:mm        yyyy-MM-dd HH:mm        
        //yy/MM/dd H:mm:ss      yyyy-MM-dd H:mm:ss      
        //yy/MM/dd HH:mm:ss     yyyy-MM-dd HH:mm:ss 

(^|\s)(3[01]|[12]\d|0?[1-9])(/|-|/.)(1[0-2]|0?\d)(/|-|/.)(19|20)?\d\d(\s+(0?\d|1\d|2[0-4]):[0-6]\d(:[0-6]\d)?(\s+([AP]M|GMT|[+-]\d\d:?\d\d))?)?
        //fr-FR         
        //dd.MM.yy              dd/MM/yy            dd-MM-yy            dd/MM/yyyy
        //dd.MM.yy H:mm         dd/MM/yy H:mm       dd-MM-yy H:mm       dd/MM/yyyy H:mm
        //dd.MM.yy H:mm:ss      dd/MM/yy H:mm:ss    dd-MM-yy H:mm:ss    dd/MM/yyyy H:mm:ss
        //dd.MM.yy HH' h 'mm    dd/MM/yy HH' h 'mm  dd-MM-yy HH' h 'mm  dd/MM/yyyy HH' h 'mm
        //dd.MM.yy HH.mm        dd/MM/yy HH.mm      dd-MM-yy HH.mm      dd/MM/yyyy HH.mm
        //dd.MM.yy HH:mm        dd/MM/yy HH:mm      dd-MM-yy HH:mm      dd/MM/yyyy HH:mm
        //dd.MM.yy HH:mm:ss     dd/MM/yy HH:mm:ss   dd-MM-yy HH:mm:ss   dd/MM/yyyy HH:mm:ss

解决方法

我要走出困境并假设你没有解析当天的名字,只要其余的日期和时间匹配……毕竟,一旦解析了日期,可以重新生成当天的名称(这需要额外的表达复杂性,所以我决定将其排除.那就是说,我有一个表达式似乎很好地找到GetAllDateTimePatterns返回的所有日期格式,还有其他几个也可能出现(不确定你是否想要这些……):

Tuesday 20 February 2010
mon,jun 12,1999
tue,december 9 1901
Friday,February 03,1900
January 12,2012

(请注意,它与日期名称不匹配,但与日期匹配)

这是表达式:

(?i)((3[01]|[12]\d|0?[1-9]|\d{4})([\s/.-]))?\b(1[0-2]|0?\d|(jan|febr?)(uary)?|ma(r(ch)?|y)|a(pr(il)?|ug(ust)?)|(sept?|oct|nov|dec)((em|o)ber)?|ju(ne?|ly?))\b(\3|\s)(((?(2)|3[01])|[12]\d|0?[1-9])(?(2)\d\d\b|\b,?\s+(20|19)?\d\d))?\s+(\d+([:.]\d+)+)?

我相信它相当不错(我认为与人类快速浏览文本一样准确),但显然远非完美,因此需要在软匹配后进行真正的解析.如果可能的话,可以通过从搜索中排除部分消息来提高整体搜索的效率 – 如果您要查找的日期都在标题中,那么只针对标题运行表达式!

让我知道它是否运作良好,或者你找到任何边缘情况,我会看看我是否可以修改它.

猜你在找的正则表达式相关文章