正規表現とワイルドカードは違います

注意:ここでは正規表現とワイルドカード自体については説明しません。ここで紹介するような間違いに注意して、もう一度検索してください。

「・・・がわかっていない人は、情報関係の本なんて書くべきではない」なんてことを言うと自分に跳ね返ってきそうで怖いのですが、正規表現とワイルドカードの違いがわかっていない人は、お願いですから情報関係の教科書は書かないでください。

計算機概論の講義のネタを集めているときに、「正規表現とワイルドカードをごっちゃにする」というとんでもない間違いが世に蔓延っているのを知りました。影響力の小さいブログとかなら別にいいのですが、情報処理技術者試験の教科書や、IT用語辞典が間違っているのはまずいでしょう。

たとえば、手元にあった『ソフトウェア開発技術者完全教本』には、次のような記述がありました。

正規表現は、特定の文字列ではなく文字列の一部を一般化して表現するための手法。プログラム言語理論の分野において、字句(変数名や予約語、その他の識別子)を一般化して定義するために考案された表現である。

たとえば、文字列検索において、”*”を任意の文字列(空文字も含む)、”?”を任意の1文字として指定できるとすると、検索文字列に”abc*”と指定すると、次のような文字列が検索の対象となる。

abc, abcd, abcded, abcdefghijklmnなど

などが検索の対象となる。また、”a?c”と指定した場合は、次のような文字列が検索の対象となる。

abc, aac, axcなど

最初の説明は変ですし、後の例は正規表現ではなくワイルドカードのものです。開いた口がふさがらないというやつです。

もう1冊、『情報処理技術者試験学習書 情報処理技術者』には次のような記述がありました。

文字列に対して、特定の文字(”$”、”*”など)を組み合わせて表現することを正規表現という。この特定の文字を、メタキャラクタという。メタキャラクタは特別な意味を持っている。UnixやWindowsなどでファイルを検索するとき、”*.jpg”と指定すると、拡張子が”jpg”であるファイルが検索される。このときの”*”がメタキャラクタである。

メタメタですね。ちょっとした誤解というわけではなさそうです。

辞典も信用なりません。SL900Xに収録されている情報処理技術者用語辞典によれば、

字句をパターンの集合で表す式で定義する表現方式。(中略)「*」はワイルドカードとして利用される。

されません。正規表現とワイルドカードは違います。なんか、やばいことになってませんか?

ASCIIのデジタル用語辞典(Glossary Help)には、先の『ソフトウェア開発技術者完全教本』とほとんど同じ説明が載ってますね。やれやれ(著作権とかは大丈夫なんでしょうか。ウソを護ってもしょうがないかもしれませんが)。

同じくASCIIのデジタル用語辞典(PC EXPLORER)によれば、

文字列の一部をパターン化して記述する方法。正規表現を用いた検索では、特定の単語そのものだけではなく条件に一致する複数の単語を検索できる。UNIXなどで一般的な文字列検索プログラム「grep」では、キーワード中の「*」を任意の文字列、「?」を任意の1文字として検索できる。

できません。それはワイルドカードです。

教科書も辞典もダメだとすると、学生は何に頼ったらいいんでしょう。

学問の場では批判的に見られることが多いようですが、Wikipediaの説明はけっこういいと思いますよ(同じような話は拙著にも書きましたが)。「Wikipediaは信頼性が・・・」なんて乱暴な言い方はできなくなりますね。

拡張された正規表現には正規言語ではない文字列も表せるものも多く、ゆえに正規表現という名前は実態に即していない面もあるが、伝統的に正規表現と呼ばれ続けている。

詳説 正規表現 第3版正規表現の解説書は、Friedl『詳説 正規表現』(第3版)が定番です(最近、新しい翻訳が出ました)。

言語理論の教科書は、Hopcroft, Ullman, Motwani『オートマトン言語理論 計算論』が定番ですが、Sipser『計算理論の基礎』(原著第2版)という新しい教科書もお薦めです(学生だったときに、これの第1版を読みました。1冊のほうが扱いやすくていいのですが)。

432012207043201220894320122097

ちゃんと勉強したい学生の皆さんは、定評のある教科書を選ぶと良いでしょう。

追記:だから、正規表現とワイルドカードは違うんだって

お約束ですが、実際にコードを書きながら正規表現を学びたいという方には、拙著『Webアプリケーション構築入門 実践!Webページ制作からマッシュアップまで 』(森北出版, 2011)がおすすめです。

7 thoughts on “正規表現とワイルドカードは違います

  1. 矢吹さんの計算機概論の講義受けてみたかったです。
    こうやって言われてみると、混同して理解しているものが多そうですね。

  2. Shioざわさん
    私の講義は、「一部の優秀な学生を満足させる」ことを目的にはしていないので、
    そんなに面白くはないかもしれませんよ(間違い探しに来ると楽しめるかも)

  3. Google検索結果よりたどり着きましたが、厳密に正規表現とワイルドカードの違いをこの場では説明しないんですか?
    個人的にはその違いを確認したく検索ワードに入れただけに、他の文献の批判が大半を占めながらも、それに対する個人の見解が他の本を参照せよでは些か不満でした。せめて自分なりの見解の記載があると、読者として有意義なものになりましたのに。
    (たまたまこのページにたどり着いただけなので、もし別ページで解説があったらすみません。ただし、現状Googleで「ワイルドカード 正規表現 違い」のキーワードで当ページが一番にたどり着くページである以上、こういった要望は多々考えられるものと思いますので、御一考ください。)

  4. A.Sさん
    この記事の意義は、
    ・間違った説明が巷にあふれていることへの注意を喚起すること
    ・正しく理解したい人のためのポインタを示すこと
    にあると思います。
    たしかに、「正規表現とは何か」や「ワイルドカードとは何か」という説明があるのが理想かもしれません。
    しかし、たとえば、拙著「Webアプリケーション構築入門」では、正規表現の最低限の説明に3ページを要しました。同様の説明をブログで書くのはちょっと大変なのです。

  5. ピンバック: 正規表現とワイルドカードは違う | hacknote

  6. ピンバック: 正規表現 ワイルドカード 違い – 俺的自習室

  7. ピンバック: grepと正規表現(regex) | IT技術情報局

コメントは停止中です。