日本の日時表記と米国日時表記を意識した正規表現を考えてみた。個人的備忘録
英国式の日月年形式に対してはちょっと無理があるが見なかったことにする。
最後の年月日時分秒でpython正規表現では一応はヒットできた。
なんでこんなに面倒なんだろう。。
日(day)にヒットする正規表現
'\\s*(?:[12][0-9]|3[01]|0?[1-9])\\s*(?:th\\s*)?[日\\-/\\.,]?'
月(month)にヒットする正規表現
month '\\s*(?:(?:1[0-2]|0?[1-9])\\s*[月\\-/\\.,]?|(?:Jan(?:uary|\\.)?|Feb(?:ruary|\\.)?|Mar(?:ch|\\.)?|Apr(?:il|\\.)?|May\\.?|Jun[e|\\.]?|Jul[y|\\.]?|Aug(?:ust|\\.)?|Sep(?:tember|\\.)?|Oct(?:ober|\\.)?|Nov(?:ember|\\.)?|Dec(?:ember|\\.)?)\\s*)'
西暦年(year)にヒットする正規表現
'\s*(?:\d{4}|[\']?\d{2})\s*[年\-/\.,]?'
和暦元号年(gengo)にヒットする正規表現
大化から令和まで
'\\s*(?:[ABDEHIKM-PR-UWYZ]\\.?|[万久乾享仁令保元和嘉大天安宝 寛寿平康延建弘徳応慶承文斉昌明昭暦朱正永治白神至興観貞長霊養][万中 久亀亨享仁保元化吉同和喜嘉国安宝寛寿平延弘徳応慶成承授政文明暦正武 永治泰祚祥禄禎福老衡観護貞銅長雉雲養鳥][勝宝感景神]?[字宝護雲]?)\\s*?(?:\\d{1,2}|元)[年\\-/\\.,]?'
時(hour)にヒットする正規表現
'\\s*(?:1[0-9]|2[0-4]||0?[0-9])\\s*[\\.:時]'
分(minute)にヒットする正規表現
'\\s*(?:[1-5][0-9]|0?[0-9])\\s*[\\.:分]'
秒(seconds)にヒットする正規表現
'\\s*(?:[1-5][0-9]|0?[0-9])\\s*(?:秒|[Ss]ec(?:onds)?)?\\s*(?:[,\\.]?\\s*\\d+)?'
曜日(weekday)にヒットする正規表現
'\\s*(?:\\(?[日月火水木金土](?:曜日)?\\)?|(?:Sun|Mon|Tues?|Wed(?:nes)?|Thu(?:rs)?|Fri|Sat(?:ur))(?:day)?[\\.,]?)'
時刻(time)にヒットする正規表現
'(?:\\s*(?:[AaPp]\\.?[Mm]\\.?|午[前後]))?(?:\\s*(?:1[0-9]|2[0-4]||0?[0-9])\\s*[\\.:時])(?:\\s*(?:[1-5][0-9]|0?[0-9])\\s*[\\.:分])?(?:\\s*(?:[1-5][0-9]|0?[0-9])\\s*(?:秒|[Ss]ec(?:onds)?)?\\s*(?:[,\\.]?\\s*\\d+)?)?(?:\\s*(?:[+\\-]\\d{4}))?(?:\\s*\\(?(?:[ABCDEFGHIJKLMNOPRSTUVWY][ABCDEFGHIJKLMNOPRSTUVWXYZ][ABCDGHKLMNORSTUVWZ][1DST][T])\\)?)?(?:(?:\\s*(?:[+\\-]\\d{4})\\s*\\(?(?:[ABCDEFGHIJKLMNOPRSTUVWY][ABCDEFGHIJKLMNOPRSTUVWXYZ][ABCDGHKLMNORSTUVWZ][1DST][T])\\)?|\\s*(?:[+\\-]\\d{4})|\\s*\\(?(?:[ABCDEFGHIJKLMNOPRSTUVWY][ABCDEFGHIJKLMNOPRSTUVWXYZ][ABCDGHKLMNORSTUVWZ][1DST][T])\\)?))?(?:\\s*(?:[AaPp]\\.?[Mm]\\.?|午[前後]))?'
年月日(date)にヒットする正規表現
"(?:(?:\\s*(?:\\d{4}|[']?\\d{2})\\s*[年\\-/\\.,]?|\\s*(?:[ABDEHIKM-PR-UWYZ]\\.?|[万久乾享仁令保元和嘉大天安宝寛寿平康延建弘徳応慶承文斉昌明昭暦朱正永治白神至興観貞長霊養][万中久亀亨享仁保元化吉同 和喜嘉国安宝寛寿平延弘徳応慶成承授政文明暦正武永治泰祚祥禄禎福老衡 観護貞銅長雉雲養鳥][勝宝感景神]?[字宝護雲]?)\\s*?(?:\\d{1,2}|元)[ \\-/\\.,]?)\\s*(?:(?:1[0-2]|0?[1-9])\\s*[月\\-/\\.,]?|(?:Jan(?:uary|\\.)?|Feb(?:ruary|\\.)?|Mar(?:ch|\\.)?|Apr(?:il|\\.)?|May\\.?|Jun[e|\\.]?|Jul[y|\\.]?|Aug(?:ust|\\.)?|Sep(?:tember|\\.)?|Oct(?:ober|\\.)?|Nov(?:ember|\\.)?|Dec(?:ember|\\.)?)\\s*)\\s*(?:[12][0-9]|3[01]|0?[1-9])\\s*(?:th\\s*)?[日\\-/\\.,]?\\s*(?:\\(?[日月火水木金土](?:曜日)?\\)?|(?:Sun|Mon|Tues?|Wed(?:nes)?|Thu(?:rs)?|Fri|Sat(?:ur))(?:day)?[\\.,]?)?|\\s*(?:\\(?[日月火水木金土](?:曜日)?\\)?|(?:Sun|Mon|Tues?|Wed(?:nes)?|Thu(?:rs)?|Fri|Sat(?:ur))(?:day)?[\\.,]?)?(?:\\s*(?:\\d{4}|[']?\\d{2})\\s*[年\\-/\\.,]??(?:\\s*(?:(?:1[0-2]|0?[1-9])\\s*[月\\-/\\.,]?|(?:Jan(?:uary|\\.)?|Feb(?:ruary|\\.)?|Mar(?:ch|\\.)?|Apr(?:il|\\.)?|May\\.?|Jun[e|\\.]?|Jul[y|\\.]?|Aug(?:ust|\\.)?|Sep(?:tember|\\.)?|Oct(?:ober|\\.)?|Nov(?:ember|\\.)?|Dec(?:ember|\\.)?)\\s*)\\s*(?:[12][0-9]|3[01]|0?[1-9])\\s*(?:th\\s*)?[日\\-/\\.,]?|\\s*(?:[12][0-9]|3[01]|0?[1-9])\\s*(?:th\\s*)?[日\\-/\\.,]?\\s*(?:(?:1[0-2]|0?[1-9])\\s*[月\\-/\\.,]?|(?:Jan(?:uary|\\.)?|Feb(?:ruary|\\.)?|Mar(?:ch|\\.)?|Apr(?:il|\\.)?|May\\.?|Jun[e|\\.]?|Jul[y|\\.]?|Aug(?:ust|\\.)?|Sep(?:tember|\\.)?|Oct(?:ober|\\.)?|Nov(?:ember|\\.)?|Dec(?:ember|\\.)?)\\s*))|(?:\\s*(?:(?:1[0-2]|0?[1-9])\\s*[ 月\\-/\\.,]?|(?:Jan(?:uary|\\.)?|Feb(?:ruary|\\.)?|Mar(?:ch|\\.)?|Apr(?:il|\\.)?|May\\.?|Jun[e|\\.]?|Jul[y|\\.]?|Aug(?:ust|\\.)?|Sep(?:tember|\\.)?|Oct(?:ober|\\.)?|Nov(?:ember|\\.)?|Dec(?:ember|\\.)?)\\s*)\\s*(?:[12][0-9]|3[01]|0?[1-9])\\s*(?:th\\s*)?[日\\-/\\.,]?|\\s*(?:[12][0-9]|3[01]|0?[1-9])\\s*(?:th\\s*)?[日\\-/\\.,]?\\s*(?:(?:1[0-2]|0?[1-9])\\s*[月\\-/\\.,]?|(?:Jan(?:uary|\\.)?|Feb(?:ruary|\\.)?|Mar(?:ch|\\.)?|Apr(?:il|\\.)?|May\\.?|Jun[e|\\.]?|Jul[y|\\.]?|Aug(?:ust|\\.)?|Sep(?:tember|\\.)?|Oct(?:ober|\\.)?|Nov(?:ember|\\.)?|Dec(?:ember|\\.)?)\\s*))\\s*(?:\\d{4}|[']?\\d{2})\\s*[年\\-/\\.,]?))"
年月日時分秒にヒットする正規表現
"(?:(?:(?:\\s*(?:\\d{4}|[']?\\d{2})\\s*[年\\-/\\.,]?|\\s*(?:[ABDEHIKM-PR-UWYZ]\\.?|[万久乾享仁令保元和嘉大天安宝寛寿平康延建 弘徳応慶承文斉昌明昭暦朱正永治白神至興観貞長霊養][万中久亀亨享仁保 元化吉同和喜嘉国安宝寛寿平延弘徳応慶成承授政文明暦正武永治泰祚祥禄 禎福老衡観護貞銅長雉雲養鳥][勝宝感景神]?[字宝護雲]?)\\s*?(?:\\d{1,2}|元)[年\\-/\\.,]?)\\s*(?:(?:1[0-2]|0?[1-9])\\s*[月\\-/\\.,]?|(?:Jan(?:uary|\\.)?|Feb(?:ruary|\\.)?|Mar(?:ch|\\.)?|Apr(?:il|\\.)?|May\\.?|Jun[e|\\.]?|Jul[y|\\.]?|Aug(?:ust|\\.)?|Sep(?:tember|\\.)?|Oct(?:ober|\\.)?|Nov(?:ember|\\.)?|Dec(?:ember|\\.)?)\\s*)\\s*(?:[12][0-9]|3[01]|0?[1-9])\\s*(?:th\\s*)?[日\\-/\\.,]?\\s*(?:\\(?[日月火水 木金土](?:曜日)?\\)?|(?:Sun|Mon|Tues?|Wed(?:nes)?|Thu(?:rs)?|Fri|Sat(?:ur))(?:day)?[\\.,]?)?|\\s*(?:\\(?[日月火水木金土](?:曜日)?\\)?|(?:Sun|Mon|Tues?|Wed(?:nes)?|Thu(?:rs)?|Fri|Sat(?:ur))(?:day)?[\\.,]?)?(?:\\s*(?:\\d{4}|[']?\\d{2})\\s*[年\\-/\\.,]??(?:\\s*(?:(?:1[0-2]|0?[1-9])\\s*[月\\-/\\.,]?|(?:Jan(?:uary|\\.)?|Feb(?:ruary|\\.)?|Mar(?:ch|\\.)?|Apr(?:il|\\.)?|May\\.?|Jun[e|\\.]?|Jul[y|\\.]?|Aug(?:ust|\\.)?|Sep(?:tember|\\.)?|Oct(?:ober|\\.)?|Nov(?:ember|\\.)?|Dec(?:ember|\\.)?)\\s*)\\s*(?:[12][0-9]|3[01]|0?[1-9])\\s*(?:th\\s*)?[日\\-/\\.,]?|\\s*(?:[12][0-9]|3[01]|0?[1-9])\\s*(?:th\\s*)?[日\\-/\\.,]?\\s*(?:(?:1[0-2]|0?[1-9])\\s*[月\\-/\\.,]?|(?:Jan(?:uary|\\.)?|Feb(?:ruary|\\.)?|Mar(?:ch|\\.)?|Apr(?:il|\\.)?|May\\.?|Jun[e|\\.]?|Jul[y|\\.]?|Aug(?:ust|\\.)?|Sep(?:tember|\\.)?|Oct(?:ober|\\.)?|Nov(?:ember|\\.)?|Dec(?:ember|\\.)?)\\s*))|(?:\\s*(?:(?:1[0-2]|0?[1-9])\\s*[月\\-/\\.,]?|(?:Jan(?:uary|\\.)?|Feb(?:ruary|\\.)?|Mar(?:ch|\\.)?|Apr(?:il|\\.)?|May\\.?|Jun[e|\\.]?|Jul[y|\\.]?|Aug(?:ust|\\.)?|Sep(?:tember|\\.)?|Oct(?:ober|\\.)?|Nov(?:ember|\\.)?|Dec(?:ember|\\.)?)\\s*)\\s*(?:[12][0-9]|3[01]|0?[1-9])\\s*(?:th\\s*)?[日\\-/\\.,]?|\\s*(?:[12][0-9]|3[01]|0?[1-9])\\s*(?:th\\s*)?[日\\-/\\.,]?\\s*(?:(?:1[0-2]|0?[1-9])\\s*[月\\-/\\.,]?|(?:Jan(?:uary|\\.)?|Feb(?:ruary|\\.)?|Mar(?:ch|\\.)?|Apr(?:il|\\.)?|May\\.?|Jun[e|\\.]?|Jul[y|\\.]?|Aug(?:ust|\\.)?|Sep(?:tember|\\.)?|Oct(?:ober|\\.)?|Nov(?:ember|\\.)?|Dec(?:ember|\\.)?)\\s*))\\s*(?:\\d{4}|[']?\\d{2})\\s*[ \\-/\\.,]?))(?:\\s*|[T:])?(?:\\s*(?:[AaPp]\\.?[Mm]\\.?|午[前後]))?(?:\\s*(?:1[0-9]|2[0-4]||0?[0-9])\\s*[\\.:時])(?:\\s*(?:[1-5][0-9]|0?[0-9])\\s*[\\.:分])?(?:\\s*(?:[1-5][0-9]|0?[0-9])\\s*(?:秒|[Ss]ec(?:onds)?)?\\s*(?:[,\\.]?\\s*\\d+)?)?(?:\\s*(?:[+\\-]\\d{4}))?(?:\\s*\\(?(?:[ABCDEFGHIJKLMNOPRSTUVWY][ABCDEFGHIJKLMNOPRSTUVWXYZ][ABCDGHKLMNORSTUVWZ][1DST][T])\\)?)?(?:(?:\\s*(?:[+\\-]\\d{4})\\s*\\(?(?:[ABCDEFGHIJKLMNOPRSTUVWY][ABCDEFGHIJKLMNOPRSTUVWXYZ][ABCDGHKLMNORSTUVWZ][1DST][T])\\)?|\\s*(?:[+\\-]\\d{4})|\\s*\\(?(?:[ABCDEFGHIJKLMNOPRSTUVWY][ABCDEFGHIJKLMNOPRSTUVWXYZ][ABCDGHKLMNORSTUVWZ][1DST][T])\\)?))?(?:\\s*(?:[AaPp]\\.?[Mm]\\.?|午[前後]))?)"
テストパターン
# 日本式
"2001/08/24"
"平成13年08月24日"
"2001/08/24 20:10"
"2001年8月24日金曜日 20:10"
"2001年8月24日(金) 20:10"
"令和元年08月24日PM 08:10"
"令和元年08月24日 PM08:10:"
"令和元年08月24日 午後8:10"
"令和2年08/24午後08:10"
"令和元年08月24日 8時10分30秒"
# 米国式 mm-dd-yy
"08-24-2001"
"Friday, August 24th, 2001"
"Fri Aug. 24, 2001 8:10 p.m."
"Fri Aug. 24, 2001 20:10"