メイン | 2006年11月 »

2006年10月 アーカイブ

2006年10月23日

正規表現を使うために

 正規表現
データベースや、プログラミング、Web作成に興味のある方なら、耳にする言葉です。

ところが、初心者には、とてもイメージしにくい言葉なのです。

単なる、記号の羅列に見える表現を「正しい表現」のような名前で呼ばれているのが、そもそもの間違いな気がしてなりませんが、勉強しないとはじまらないと思い、このサイトを立ち上げました。

このサイトは、正規表現の基本的な知識を知るための入門書です。大きな特徴として、実際に正規表現が、どのような働きをしているのかを体験できるように、正規表現チェッカーを用意しました。これは、ここに書いてあるような基本事項だけでなく、詳細が書いてあるリファレンスを読むときにも使えるものです。

この機会に、正規表現が何のためにあるのか、どのように使われているのかをご理解いただければ幸いです。

なお、あくまでも入門書として、複雑な表現や、利用環境に左右される内容には触れないように心がけています。過去に正規表現を利用したことがある方は、正規チェッカーだけお試しになり、内容に関してはもっと詳細が書いてあるページをご覧ください。

正規表現とは

 正規表現と言うのは、条件を示す「式」であると考えてください。私たちが目にする条件式とは、【=】【<】【>】のようなものだと思います。これらは、数字など、大きさを表現するものですが、正規表現では、数字ではなく、テキストを表現するものです。

数字の表現の例

100と言う数字と50と言う数字を比較しましょう。

【100>50】→はい、その通り(True)
【100<50】→いいえ、ちがいます。(False)

と表現できます。
それでは正規表現の場合は、どのようになるかと言えば、

テキストの表現の例(正規表現)
「あいうえお」と言うテキストを表現します。

「あいうえお」は、「あいうえお」である。
【あいうえお,あいうえお】→はい、含まれています(True)

あいうえおには、「あい」が含まれている
【あいうえお,あい】→はい、含まれています(True)

「あいうえお」は、「かきくけこ」と同じである。
【あいうえお,かきくけこ】→いいえ、違うテキストです(False)

少々、極端な例ですが、これが正規表現の目的です。
調べたい文字列に対して、指定された条件に適合しているかを調べる為に使われるものです。
正規表現は、その条件を指定するための表現方法なのです。

正規表現の言葉

 正規表現を勉強するに当たり、特有の言葉があるので、先に書いておきます。

【マッチする】
 正規表現とは、テキストが条件に会うか調べるための条件式です。条件にあっている場合を「マッチする(True)」と表現し、条件を満たさない場合を、「マッチしない(False)」と呼びます。

【メタキャラクタ】
 条件を指定するときに利用する文字をメタキャラクタと呼びます。
\ . * + ? ^ $ | ( ) { } [ ]
などがありますが、その意味合いは、事項で説明します。

【このサイトでの表現方法】
ここでは、正規表現の例を次のように書くことにします。
【条件】【テキスト】=【マッチする(しない】
この条件と言うのは、いわゆる正規表現のことです。
実際に、プログラムで使うときなどは、
if (ereg(条件,テキスト)){
}else{}
などのように使うことでしょう。
※「ereg」は、PHPで正規表現を使って文字列を調べるための関数

一番簡単な正規表現

ここからは、実際に正規表現を試しながら学びます。

一番簡単な、正規表現の例を示します。
【a】【abcde】=【マッチします】
これは、【abcde】と言う文字列が、【a】と言う条件に合うかどうか調べています。
プログラムなどで、【'a'='abcde'】などと表現すると、False(適合しない)になりますが、正規表現の場合は、【a】と言う文字が含まれているか?と言う判断をします。
 次のような例も確認指定ください。

【x】【abcde】=【マッチしません】
【bc】【abcde】=【マッチします】・・・・含まれていればどこでも良い
【ac】【abcde】=【マッチしません】・・連続していないときは、不適合

この条件の部分には、正規表現メタキャラクタを用いることで、より複雑な条件を指定できるのですが、基本的な考え方は、このようなものです。

次の表現が、マッチするか、しないか、演習だと思って考えてみてください。
【さんが転んだ】【だるまさんが転んだ】=【】
【おはよう】【ございます】=【】
【はい】【わがはいは、ねこである】=【】
【いいえ】【いい絵ですね】=【】

正規表現を試す

 正規表現の文献を読んでも、どうも理解できない。実感できないと言うのが私の感想です。
実感の無いものを、プログラムなどで使おうとしても、「ここで使いたい」と思うだけで終わってしまいます。それは、その方法が正しいのか自信がないからです。そこで、便利ツールを用意しました。

正規表現チェッカーです。

上記リンクを右クリックなどから、新しいブラウザで開きます。ブラウザのウィンドウサイズを小さくしておくと便利です。
使い方は、上のテキストボックスに、正規表現を、下のボックスに、評価したいテキストを入力して、「Check Now!」ボタンをクリックします。すると、テキストボックスの下に、マッチしたか、しなかったかが表示され動作が確認できます。テキストボックスには、テキストが引き続いて表示されているので、そのつど書き換えることで、正規表現を訂正したり、テキストを変更して確認できます。

試しに、先に書いた演習を入力して、答え合わせを行ってください。

※このチェッカーは、英語にまったく無知な筆者が、翻訳プログラムで、和→英変換している部分があります。おかしい場合は、指摘してください。お願いします。

メタキャラクタ その1 基本

正規表現は、メタキャラクタと言う指定された文字を使うと、より複雑な条件指定が出来ます。その中で、良く使われる基本的なものについて述べたいと思います。例を挙げながら説明していきますが、ただ読むだけでなく、正規表現チェッカーで、実際に確かめ、時には例題を自分で書き換えて、アレンジしながら、読み進めると解りやすいと思います。

メタキャラクタ「.」ドット

【.】(ドット)は、任意の1文字であることを指定します。つまり、何でも良いわけです。
日本語的には、一種の伏字だと思ってください。

例(すみません、こんな例で・・・)
【.bc】【abc】=【マッチします】
・・・他にも【bbc】【cbc】はマッチしますが【ac】はマッチしません

【.ックス】【サックス】=【マッチします】
・・・他にも【シックス】【ソックス】【マックス】【エックス】などがマッチしますが、【マンクス】【ランクス】はマッチしません

注意事項
メタキャラクタ【.】ドットは、任意の一文字なのですが、例題の用に先頭、もしくは最後の一文字として使う場合は、一文字でなくてもマッチします。それは、正規表現が、「等しい」ではなく「含まれる」と言う基準で判断するからです。このように慣れていないと見落としてしまう落とし穴が沢山あるので、実際に使うときは、リファレンスに頼らず、実際に試してみる必要がありそうです。

メタキャラクタ その2 文字数指定

 先ほど、【.】は、一文字の伏字のようなものと書きました。
しかしながら、一文字ではなく、文字数を指定して使うことが出来ます。

その方法は、【*】や【+】【{}】を組み合わせて使います。

それでは、ひとつづつ例をあげながら説明します。

【*】を使う。

【a.*c】【abbbbbbbbbc】=【マッチします】
【*】は、0文字以上の任意の文字を指定します。0でもよいということは、【ac】もマッチします。しかしながら、【ca】はマッチしません。


【+】を使う。
 上記の例の【.*】を【.+】にします。この場合は、1文字以上になりますので、【ac】はマッチしません。

【?】を使う
 上記の例の【.*】を【.?】にします。この場合は、0文字か、1文字なので、【ac】や【abc】はマッチしますが、【abbc】はマッチしません

【{}】を使う
 文字数を、明確に指定することが出来ます。
【a.{5}c】【a12345c】=【マッチします】
これは、aとcの間に、5文字の任意の文字があればマッチするものです。この例では、【aあいうえおc】はマッチしますが、【ac】や【aあいうえおかc】はマッチしません。

さらに【{}】を使う
 先ほどの文字数指定の方法として、○文字以上、○文字以下という文字数の範囲を指定することも出来ます。
【a.{5,10}c】【a123456789c】=【マッチします】
 この例では、aとcの間に、5文字以上、10文字以内の任意の文字があるときにマッチします。つまり、【aあいうえおc】も、【aあいうえおかきくけこc】もマッチします。

メタキャラクタ その3 複数条件

 ここでは、条件を複数指定したい場合を考えます。

例えば、条件Aと条件Bのどちらかの条件に合えば、マッチする。
という場合です。一番簡単な表現で考えましょう。

【|】を使う
【|】は、条件を複数指定するためのメタキャラクタです。次のように使います。
【abc|あいう】【あいう】=【マッチします。】
この条件の場合、【abc】か、【あいう】の文字列のどちらかが、もしくは両方が存在すればマッチすることになります。
もう少し例を挙げると、【abcあいう】【あいうえお】【abcdefg】はマッチしますが、【abあい】はマッチしません。

さらに【|】を使う
【|】は、なにも2つだけの条件ではなく、【あいう|abc|123】など必要なだけ指定することが出来ます。

メタキャラクタ その4 位置の指定

 次に、簡単な例を出してみます。
条件【a】文字列【abc】=【マッチします。】

この場合、他にどのような文字列がマッチすると思いますか?
実は、【bba】【bac】など、文字列の長さにも、「a」の条件がある場所も関係なく、「a」がどこかにあれば、全てマッチします。

しかしながら、場合によっては、文字列の先頭が「a」のときだけマッチさせたい場合が出てきます。その場合の、正規表現を説明します。

【^a】【abc】=マッチします。
この【^】は、文字列の先頭を対称にするという意味を持ちます。ですので、この場合、【baa】ではマッチしなくなります。

 なお、先頭ではなく最後を示す場合は、【$】を使います。

正規表現をなんに使う?

 ここまで、正規表現について説明してきました。紹介したメタキャラクタなどは、ほんの一部ですし、実施には、複数のメタキャラクタを組み合わせて、利用することが大半です。

このページは、記号の羅列に見える正規表現が、どんな働きをしているのかを実感していただければ、それで満足です。ここまで、読み進められた方は、他の難しいページにたどり着いても、その意味が解る程度の基礎知識を身につけていると思います。

 また、現在、動作確認が完璧でない正規表現チェッカーですが、不具合があります。
このスクリプトは、テキストボックスから、テキストを受け取り、そのままif(ereg)で判断しているだけです。エスケープ文字などで不具合があるようです。
 希望があれば、直しますが、私はプログラマーではないので、うまく出来るかどうかわかりません。また、利用する言語により、独自の表現方法が存在するため、詳しい方は、ご自分の環境下で、自作するのが良いかと思います。その際は、無事に動くツールとして、掲載しますので、連絡していただければ幸いです。

About 2006年10月

2006年10月にブログ「試して学習・実践正規表現」に投稿されたすべてのエントリーです。過去のものから新しいものへ順番に並んでいます。

次のアーカイブは2006年11月です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

Powered by
Movable Type 3.35