著作一覧 |
あるHTML群を変換してデータセットを取り出すプログラムが必要になった。
が、HTMLはそれなりにあるし、しかし数は有限個で、しかも大体同じような形式で作られている。
のこぎりというほどのことはないし、そもそもC#で実装したいわけだ。
で、正規表現を使って開始、中間(ループする)、終了の3つの正規表現の組み合わせを複数用意して、最初に開始に引っ掛かったところで、終了にひっかかるまで中間を繰り返し適用して値を抽出してレコードセットを作るという実装とした。
で、あるHTMLについては<!-- ここから始まる -->をそのまま開始の正規表現、<!-- ここまで -->を終了の正規表現として、そこまでは話は楽だった。
が、中間の部分が、12個くらいあるTDから8個程度のTEXT要素を取り出すのは良いのだが、良くわからない基準でコメントアウトがされるTDがある。で、結構それまでは頭を使わずに、>\s+<TD[^>]+>([^<]+)[^>]+>\s+みたいな感じで、~が出てくるまでは読み飛ばすだのグループに含めるだのやっていたのだが(実際にはIDを拾ったりJavaScriptの引数を拾ったりするので、もっと複雑だが、たいていは([^']+)'だの([^"]+)")で済んでいたことに変わりはない)、そのてが効かなくなった。で、何気なく.+<TD(この後ろに特徴的な属性とかIDとかを指定している)とか書いてみたら、あっというまに最後のやつを拾ってきて(つまり1セット分しか取れない)、ああ、そうか最長一致かと気付き、.+?<TDとか書いたら何かおかしい。
Visual Studioでデバッグ開始するとIEがずーっと止まっている。なんか連携がうまくいかなくてIEがはまっているのだろうとか最初は考えていたが、良くみるとCPUが50%(デュアルコアだし)で張り付いていたりして、最初何が何だかわからなかった。
で、結局.をほとんど使わないように(?:<--\s*)?とかを入れて書き換えたわけだが、なるほど、へまな正規表現はへまなSQL並に危ないなと実感したのだった。
ジェズイットを見習え |