2021年03月24日

正規表現で何でもパース出来ると思うな

不思議な事に、世の中には、何でも正規表現で処理しようという人種が居る。例えばHTMLJSONのパース処理を正規表現を駆使してやろうとする。

何故、わざわざ正規表現を使おうとするのか。既に誰かが作ったパーサライブラリが在るというのに、そういった物は頑なに使おうとはしない。あくまで正規表現を使って何とかしようとする。

既存のライブラリを使った方が良い点として:

  • なんと言っても、正規表現は容易に「暗号文」化する。複雑な構造のデータをパース出来る、複雑な構造の正規表現を書いた当人は大いに満足しているのかもしれないが、後からそれを「解読」する人間の身にもなってほしい。
  • 枯れている。少なくとも、今この瞬間に書かれた、その正規表現よりは枯れている。つまりバグが混入している可能性は、今書かれたソレよりも格段に低い。
  • 必要な処理を実装する時間も短くて済む。例えば、「HTMLコード中の『foo』というIDを持つ要素の子孫要素として存在する『bar』クラスの要素の直接の子要素の最初のテキストノードの内容を全て拾え」、という処理が在ったとして、「任意のIDの要素を取得」「任意の要素の子孫要素を全て取得」「任意のクラスを持つ要素を全て取得」「テキストノードの内容を取得」なんて処理は、パーサライブラリが既に用意しているだろう。今からその正規表現を書く時間は無駄である。

そもそもの話として、正規表現は万能ではない。HTMLJSONのような、「入れ子になった構造」を処理できない。なので、そういった物を処理しようとして書いた、その正規表現には、100%バグが潜んでいる事になる。今、受け取っているデータは処理できたとしても、一寸だけ内容の変わったデータが来ると途端に木偶と化す可能性が在る。詳しくは、例えば 「Leo's Chronicle: 正規表現に見切りをつけるとき」 等を参照。

正規表現で何でもパース出来ると思うな。悪い事は言わないから、良いから黙って専用のパーサライブラリを使え。

ラベル:regexp
posted by 天井冴太 at 22:34| Comment(0) | Programmers | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。