1

以下の正規表現を変更して、日付を日の部分の序数と一致させるにはどうすればよいですか?このregexは「2003年1月1日|2004年2月29日|3202年11月2日」と一致しますが、「2003年1月1日|2004年2月29日|3202年11月2日|2010年3月3日」とも一致する必要があります。

^(?:(((Jan(uary)?|Ma(r(ch)?|y)|Jul(y)?|Aug(ust)?|Oct(ober)?|Dec(ember)?)\ 31)|((Jan(uary)?|Ma(r(ch)?|y)|Apr(il)?|Ju((ly?)|(ne?))|Aug(ust)?|Oct(ober)?|(Sept|Nov|Dec)(ember)?)\ (0?[1-9]|([12]\d)|30))|(Feb(ruary)?\ (0?[1-9]|1\d|2[0-8]|(29(?=,\ ((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)))))))\,\ ((1[6-9]|[2-9]\d)\d{2}))

ありがとうございました。

4

2 に答える 2

5

これはユースケースによって異なりますが、実用性のために、次のものに一致するものと一致させるのが適切な場合があります。
(1)任意の月の名前または省略形。
(2)空白;
(3)任意の1桁または2桁。
(4)空白;
(5)任意のst、nd、rd、th;
(6)空白またはコンマ+オプションの空白。
(7)任意の4桁。

何に一致するかはわかりませんが、もし私が持っていた場合は、最初からスキップするよりも、今すぐキャプチャして後で無効にしJan 35nd,3001たいと思います。

また、データセットに応じて、大文字と小文字の区別の問題や、または1 Jan 2004などの一般的な国際英語のバリエーションを検討してください。1st Jan, 2004January, 2004

改行が追加されました

^(?:j(?:an(?:uary)?|un(?:e)?|ul(?:y)?)?|feb(?:ruary)?|ma(?:r(?:ch)?|y)
|a(?:pr(?:il)?|ug(?:ust)?)|sep(?:t|tember)?|oct(?:ober)?|(?:nov|dec)(?:ember)?)  
\s+\d{1,2}(?:st|nd|rd|th)?(?:\s+|,\s*)\d{4}\b

非常に奇妙なデータセットがない限り、さらに実用的(かつ読みやすい)なのは、共通のプレフィックスの後に何でも許可することです。

(?:jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)[a-z]*?\s+\d{1,2}(?:[a-z]{2})?(?:\s+|,\s*)\d{4}\b

これは一致しoctagenarianism 99xx, 0000ますか?はい。それが問題になる可能性はありますか?疑わしい。

于 2010-01-22T18:33:40.980 に答える
2

その正規表現はwaaaaayをやりすぎています。あなたの言語に相当する。を使用する方がはるかに良いでしょうstrptime()。ただし、以下の正規表現は序数と一致します。

^(?:(((Jan(uary)?|Ma(r(ch)?|y)|Jul(y)?|Aug(ust)?|Oct(ober)?|Dec(ember)?)\ 31(st)?)|((Jan(uary)?|Ma(r(ch)?|y)|Apr(il)?|Ju((ly?)|(ne?))|Aug(ust)?|Oct(ober)?|(Sept|Nov|Dec)(ember)?)\ (0?[1-9]|([12]\d)|30))(st|nd|rd|th)?|(Feb(ruary)?\ (0?[1-9]|1\d|2[0-8]|(29(th)?(?=,\ ((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)))))(st|nd|rd|th)?))\,\ ((1[6-9]|[2-9]\d)\d{2}))

「20nd」などにも一致しますが、実際のデータでこれに遭遇する可能性は非常に低いため、ほとんどの場合、気にする必要はありません。

于 2010-01-22T16:56:44.967 に答える