仕事と晩飯とその他

日記です。

正規表現って本当にすごい

しばらく前から正規表現って本当にすごいし便利だと感心してばかり。PHP書く時に以前より頻繁に使ってる。あとはサイトの書き換えとか云々の時にも。その割にさっぱり使いこなせない。

今回、どうしてもやってみたいことがあり、改めて挑戦してみた。条件で分岐しているということは何らかのパターンが有るということなので、うまくいけばそこにスカッとハマるかもしれない。

最初はそもそもパターンをどう捉えるかで一苦労。ようやく少しだけ見えてきたところで次は場合分けが思いつかない、というかわからない。それでも色々と試しているうち、なんとなくうまく行きそうな気がしてくる。と、突然、思っていたようなパターンが定義できていることに気づく。が、なぜそれでうまくいくのかがピンとこない。

そこで一旦中断してPHPスクリプトで fgets を使って一文字ずつ読み出しての場合分けに挑戦。うむ、うまくいかない。ダメだ。いや、こうだろうか。違う。しょうがないのでループ内の処理を紙に書き出して一つずつ考え直す。ここがこうだからこうなるはず。おお、完璧ではないが少しうまく行ってる。パターンのうち二つがなんとかなった。が、あと三つ(四つ?)のパターンがうまくいかない。きちんと場合分けできない。ループの最中の変数とカウンタの値で混乱している。頭で考えるのは限界なのでもう一度紙に書き出す。今度は条件ではなく、配列のキーと値がどうなるか、条件分岐したい箇所について全部書き出してみた。そうか、ここの処理の前後で条件を変えないといけなかったのか。なるほどなるほど。

しかし、そう簡単にはうまくいかず。が、そもそも場合分けしたつもりでキレイに分けられていないことに気づく。この条件とこの条件だと前者を満たすと後者も自動的に成立してしまう。そのあたりを見直してまた何度も書き直し。

うまくいった。けど、これはこれでまだ基本の部分でしかない。

PHPで一文字ずつ読み出す方式の基本の部分がうまくいったということで、今度はそれをもう一度あらためて正規表現で書いてみることに。パターンがはっきりしたんだから、それをきちんと書けばいいだけのはずだ。そう思いながらもなかなかうまいこといかない。と思ったらある時するっと書けた。うん、これで間違いない。

で、今度は file_get_contents で読み込んだテキストファイルを preg_match_all で一気に処理するやり方に挑戦。これもなかなかうまくいかない。そもそもPHPがまともに動かない。なんかおかしい。不要な foreach を使っていた。なんとなく配列だと foreach とか思ってしまうが、まったくもって不要な箇所であった。

ついに動いた! 素晴らしい!

正規表現を考えたヒトは天才だと思う。というか、人類の頭脳じゃ思いつけないんじゃないだろうか、こんなの。そして俺がこれを使いこなせる日は来るのだろうか。

動いたと言っても不完全な状態で、 fgets で一文字ずつ読み込んだスクリプトと同じことはまだ全部できていない。けど、あとは文字数数えて場合分けするだけだから無問題。

さて、その次は和文と欧文が混じった状態での正規表現。先に和文に挑戦したので次に欧文。おや、これはスルッといけたじゃないか。素晴らしい。どうやら俺も少しは正規表現が分かってきたらしい。これなら2つ合わせても行けるんじゃないか?

図に乗っていたがそんな簡単な話ではなかった。全然うまくいかない。和欧入り混じりが全く駄目なのはしょうがないとしても、和文欧文で分けている場合でも一括で処理できない。なんだかもうすっかり意気消沈してしまった。俺に正規表現は早すぎたようだ。

帰りの電車でボーッと考えていたら、|で分ける OR での二つのパターンがキレイに分けられていないんじゃないかということに気がついた。片方の条件で両方成立してしまうパターンがある。いや、それは散々試していた時にも気がついていた。でもどうやってパターンをキレイに分けられるかが分からない。わからない。

自転車で家に帰る途中で、片方に含まれてしまうことのある条件をもっとはっきりさせたらいいのではないかと考える。でも、どうやって? あ、もしかして、単にそっちのパターン文字数を増やせば含まれることはなくなるんじゃないの?

家に帰ってやってみた。

おお。おお!

とりあえず、昨日今日で最大の課題は超えられた気がする。まだあるけど、どうだろう、そもそも正規表現では処理できない課題もあるので、そっちは単純にスクリプトで処理していいような気がする。とりあえず、PHPでなんとかしよう。

PHPでうまく行ったら最後は javascript だな。javascript で普通に正規表現を扱えることは知っていたけど、使おうと思ったことがなかった。けど、今回のはまさにぴったり。どうせ他にも javascript 使わないと出来ないことあるから。jQuery のほうが扱いやすいなあ(と思い始めている)けども、なんとか javascript でできるといいなあ。

年末年始は python へのチャレンジではなくこっちだな。β→γは、年明けの openBD のセミナー後、もしくは4月のJPROとBooksの統合の後だな。