トップ «前の日記(2011-10-27) 最新 次の日記(2011-10-29)» 編集

日々の破片

著作一覧

2011-10-28

_ 初めて返って来ない正規表現を書いた

ある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並に危ないなと実感したのだった。


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|

ジェズイットを見習え