▲ゴト技top| 第11章 1| 2| 3| 4| 5| 6| 7| 8| 9| |
[第11章●そろそろ正規表現はいかがですか] 5… ここでつまずくんだよね |
[2004.02.05登録] |
石田豊 |
「.」(ピリオド)というメタキャラクタがあります。これは「改行以外の任意の文字1文字」という意味になります。 ですから「b.d」は「bed」にも「bad」にも「bod」にもヒットします。 連続をあらわす「+」を併用して「b.+d」だと「bed」「bad」はもちろん「bend」「bended」「bolt head」「bアンドd」なんかもヒットします。 これは一見便利そうなメタキャラクタです。人様の正規表現作業を横目で見ていると、ピリオドをよくお使いになっているところを見ても、それは明らかです。 しかし、こいつは実は問題児なのです。たとえば、先ほどの段落自身(「連続をあらわす」から「ヒットします。」まで)をコピペして、「b.+d」の検索を実行します。狙いは「bed」「bad」……「bアンドd」のそれぞれにヒットさせたいわけです。 しかし、アニハカランヤ b.+d」だと「bed」「bad」はもちろん「bend」「bended」「bolt head」「bアンドd が検索結果になってしまうのです。なんでやねん。冷静に考えれば「.」は「改行以外の任意の1文字」にヒットするのですから、この結果は「bではじまりdで終わっている」という条件を完璧に満たしているじゃありませんか。当たって当然です。 正規表現の基本ルールは、条件がなるべく長い範囲でヒットするようにする、というもので、この考え方を「最長一致」といいます。 これは正規表現を使う上でもっとも注意すべき陥穽です。 たとえばHTMLファイルでは、文字にいろいろな属性を付与するために「タグ」を使います。たとえば文字を赤くしたいときには(あまりほめられた書き方ではありませんが)「<font color="red">赤くしたい文字列</font>」という具合に書きます。 こうしたタグがいっぱい含まれた文章を読まねばならんとします。どうもタグがうっとうしい。ええい、全部取ってしまえ、とばかりに 「<.+>」→ナンニモナシ なんて置換を行ってしまうと、最長一致が効いて、ほとんどすべて、文書まるごとが消えてしまいます。 正規表現は最長一致が原則ですが、処理系によってはその逆の最短一致を指定する方法も用意されています。K2Editor、miともに「+」ではなく「+?」で最短一致になります。 これを活用してもいいのですが、これとて万能ではありません。たとえば「bended」は「bend」部分だけがヒットしちゃうわけですから。 つまり「.」は、よく使いもし、便利でもあるけれど、使用に注意が必要なメタキャラクタなのです。とくに「.+」という書き方はキケンです。使わない方がいい、と言っても過言ではない。 タグ部分を検索しようとして「<.+>」という正規表現を書いちゃったことが、まさに短慮であったのです。これはたとえば、「<[^>]+>」と書けばいいのです。[^>]は前回書いたように>以外の文字という意味になります。文字クラスの列記式ですが、列記されたキャラクタはひとつだけです。が、否定の表現は文字クラスの中でしか使えないため、ひとつでも文字クラスにしなければならないのでした。これを「読み下せば」「<で始まって<以外の任意の文字(空白含む)が続き<で終わる」文字列ということになります。 文中から「bではじまりdで終わる英単語」を取り出したいのなら「b[a-z]+d」などと表現すればいい。これなら「bended」とか「bounded」「billboard」なんて単語でもちゃんと引っかかります。もしその単語が文頭に来て、大文字になってたらどーすんだよー、という危惧があるなら、「[Bb][a-z]+d」とすればよろしい。 要は、よりうまいパターンを見つけなさい、ってことですね。 タグの例においても、タグの中身をついつい「<と>の中になんらかの文字が入っている」なんてふうに認知してしまいます。もちろんそれは正しいのですが、その条件はタグの中身以外にも合致してしまうという、いわば、条件の外側への広がりの認識はついついおろそかになります。これは私ひとりのことではなく、人間に広く一般的に認められる傾向じゃないか、と思うんですね。ペンギンは鳥なんだけど、鳥はペンギンだけじゃない。 こうした近視眼的思考の通弊から脱却するためのトレーニングとしても、「プログラミング的思考」は有効で、そのもっともプライマリーなものが正規表現である、と私は思います。 |
この記事は
|
お読みになっての印象を5段階評価のボタンを選び「投票」ボタンをクリックしてください。 |
投票の集計 |
投票[ 6 ]人、平均面白度[ 4.7 ] ※「投票」は24時間以内に反映されます※ |
ご意見をお聞かせください |
|
←デジタル/シゴト/技術topへもどる | page top ↑ |
▲ゴト技top| 第11章 1| 2| 3| 4| 5| 6| 7| 8| 9| |
|ポット出版
|ず・ぼん全文記事|石田豊が使い倒すARENAメール術・補遺|ちんまん単語DB| |
|
|