4

あなたが言う前に、それは多くの正規表現です-私は知っています。誰かに正規表現を書くように頼む必要はありません! 誰かがすでにその正規表現を行っているかどうか知っていますか?

これにより、すべてのパターンが返されます: CultureInfo.CurrentCulture.DateTimeFormat.GetAllDateTimePatterns() しかし、このリストは 100% 正確ではありません。解析しないパターン (yy/mm/dd) と、リストされていない解析するパターンがあります。en-US ジェネリック DateTime.Parse の参照

私がしたことは、パターンを分解し、パターンごとに Regex を書いてみることでした。

(^|\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, dd MMMM, yyyy h:mm tt
        //dd MMMM, yyyy hh:mm tt       dddd, dd MMMM, yyyy h:mm:ss tt
        //dd MMMM, yyyy h:mm:ss tt     dddd, dd MMMM, yyyy hh:mm tt
        //dd MMMM, yyyy hh:mm:ss tt    dddd, dd MMMM, yyyy hh:mm:ss tt
        //dd MMMM, yyyy H:mm           dddd, dd MMMM, yyyy H:mm
        //dd MMMM, yyyy HH:mm          dddd, dd MMMM, yyyy HH:mm
        //dd MMMM, yyyy H:mm:ss        dddd, dd MMMM, yyyy H:mm:ss
        //dd MMMM, yyyy HH:mm:ss       dddd, dd MMMM, 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, MMMM dd, yyyy h:mm tt
        //MMMM dd, yyyy h:mm:ss tt  dddd, MMMM dd, yyyy h:mm:ss tt
        //MMMM dd, yyyy hh:mm tt    dddd, MMMM dd, yyyy hh:mm tt
        //MMMM dd, yyyy hh:mm:ss tt dddd, MMMM dd, yyyy hh:mm:ss tt
        //MMMM dd, yyyy H:mm        dddd, MMMM dd, yyyy HH:mm       
        //MMMM dd, yyyy H:mm:ss     dddd, MMMM dd, yyyy H:mm:ss     
        //MMMM dd, yyyy HH:mm       dddd, MMMM dd, 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
4

1 に答える 1

1

残りの日付と時刻が一致している限り、その日の名前を解析しなくても問題ないと思います...結局のところ、日付が解析されると、その日の名前は再生成できます (式の複雑さがさらに必要になるため、除外することにしました。とは言っても、 によって返されるすべての日付形式を見つけるのにかなりうまくいくと思われる式と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+)+)?

私はそれがかなり良いと信じています (人間がテキストをすばやくスキミングするのと同じくらい正確だと思います) が、明らかに完全にはほど遠いので、ソフト マッチの後に真の解析が必要であることがわかります。可能であれば、メッセージの一部を検索から除外することで、検索全体の効率を高めることができます。検索したい日付がすべてヘッダーにある場合は、ヘッダーに対してのみ式を実行してください。

それが十分に機能するかどうか、または見つけたエッジケースがあるかどうかをお知らせください。変更できるかどうかを確認します.

于 2012-05-02T17:59:15.180 に答える