メイン

正規表現とは アーカイブ

2006年10月23日

正規表現とは

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

数字の表現の例

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)で判断しているだけです。エスケープ文字などで不具合があるようです。
 希望があれば、直しますが、私はプログラマーではないので、うまく出来るかどうかわかりません。また、利用する言語により、独自の表現方法が存在するため、詳しい方は、ご自分の環境下で、自作するのが良いかと思います。その際は、無事に動くツールとして、掲載しますので、連絡していただければ幸いです。

2006年11月18日

正規表現は使い道

 正規表現で、一番多く使われる方法は、ユーザーが入力した情報が、正しい形式かどうかを調べるときだと思います。例えば、電話番号や、メールアドレスを入力するとき、正規表現でマッチさせて、マッチしない場合、「そのメールアドレスは間違っています」などと警告を出すときです。ここからは、私の独断と偏見で作った、使えそうな正規表現の記入例を書いていきます。

2007年02月08日

正規表現の範囲は?

 今までは条件に合うかどうかだけをを考えてきました。しかし、正規表現は、長いテキストから、条件に合う部分を抜き出すということもできます。その時に悩むのが、範囲指定です。

 例えば
【東京は晴れです。京都は雨です。】というテキストあるとして、【東京から始まって「。」で終わる一文】を探す場合、【東京*。】とすると、マッチはしますが、内容は【東京は晴れです。京都は雨です。】と最後の「。」まで広く検索します。

 この検索は、最長検索と呼ばれています。つまり、条件に合う一番広い範囲を優先するということです。正規表現では、マッチする、しないだけではなく、その文字を抜き出す、検索するといった作業を伴う場合も多いので、こでは困ります。例えば「”」で囲まれた部分とか、【】で囲まれた部分をチェックしたい場合、長い文章にそれがいくつも存在すれば、最初に出てくる部分から、一番最後の部分を取り込むことになってしま、うまくいきません。そこで、メタキャラクタ【?】を使います。【?】は、0文字もしくは1文字という意味なのですが、【+?】or【*?】のように使うと、検索を最短にします。といっても解りにくいですね。

最初の例の場合、【東京*。*?】などとします。すると、東京から始まって、任意の文字列【*】があって、【。】があって、任意の0文字もしくは1文字(*?)文字列があるとなります。言葉がおかしいのですが、【。】一回出てくれば十分なのですから、最長検索をする必要は無いと判断されるようです。結果として、最短検索になります。

 このように、テキストから、条件に合う部分を抜き出すのをマッチさせると区別して、キャプチャーすると言う場合もあります。

 この記事を書いている現在、正規表現チェッカーでは判断できません。時間を見つけて、正規表現キャプチャーチェッカーも作ろうと思います。

About 正規表現とは

ブログ「試して学習・実践正規表現」のカテゴリ「正規表現とは」に投稿されたすべてのエントリーのアーカイブのページです。過去のものから新しいものへ順番に並んでいます。

前のカテゴリはこのサイトについてです。

次のカテゴリは正規表現の事例です。

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

Powered by
Movable Type 3.35