正規表現を使うの何年振りだろ
前回の続き。
選択されたテキストの文字列が日付かどうかを判定する部分を作成中。
もし年がなくても使えるように、「年月日」の形式、「月日」の形式にあっているかどうかを調べたい。いきなりDateオブジェクトを生成すると、とんでもないことになりそうなので、とりあえずその文字列のチェックを行う。
ここで正規表現の登場。いやあ、何年振りだろ。しかも、正規表現は sed でしか使ったことがないので、Adobeアプリケーションでは初めてである。このために前回の「DTPの勉強部屋」に参加したんだよ(ウソウソ)。
せうぞーさんのテキストとにらめっこしながら、こんなんでいいのかな。
まず「月日」の形式
(1[012]|[1-9])[^\d]+(0?[1-9]|[12][0-9]|3[01])[^\d]*
\d と [0-9] が混在してるけど気にしないように(^^; 慣れてないんだからっ。多分これで「11月21日」でも「11.21」でも「11/21」でもマッチするはず。おっと「Nov. 21」とかにはマッチしない。ってこれは私の能力では無理。あきらめてください。
「11月31日」にもマッチするけど? って、それはあとで実際に存在する日付かどうかをチェックするルーチンを書くから!
次に「年月日」の形式。って何でこの国には年の表現方法が2つあるんだ。
(20|[^\d]+)?(\d?\d|元)[^\d]+(1[012]|0?[1-9])[^\d]+(0?[1-9]|[12][0-9]|3[01])[^\d]*
これで「2008年11月21日」にも「'08/11/21」にも「平成20年11月21日」にも「H20.11.21」にも対応できるのかな?
「1998年5月25日(娘の誕生日)」にはマッチしない。うーん、ここが悩みどころ。曜日だけならある程度過去の場合でも取得できるんだけど、祝日がねえ。例えば海の日が7月20日から7月の第3月曜日に変わったのって何年だっけ。そこまで精査しようとするとちょっと労力が掛かり過ぎて。
過去は曜日だけにしようかね。それでもどこまでの範囲にしよう。とりあえず1900年からにしておくか。未来も2099年までで。
(20|19|[^\d]+)?(\d?\d|元)[^\d]+(1[012]|0?[1-9])[^\d]+(0?[1-9]|[12][0-9]|3[01])[^\d]*
ということで。元号を絞り込むかどうかも迷いどころ。M・T・S・Hの全半角を含めて絞り込もうとすると頭の中が混乱します。
201年や196年にもマッチするよーと思われたあなた。鋭い!(って私が抜けてるだけなのかな) 元号の1桁にも対応しようとすると、この形しか思いつかなくて。そのあたりの年はあとではじくということで。
本当にこんなんでいいのかな。まだ抜けてそうな気がするんだけど。とりあえず今日はここまで!
11月26日 追記
せうぞーさんがいっぱいコメントを付けてくれました。続きは「名もないテクノ手」へ。