【サルにもわかる正規表現入門】

その3

3.メタ文字の種類

(4)なんでもいい文字の連続  .*

さて、 * + ?  の正規表現は、「(1)とにかくなんでもいい1文字」のところで説明しました、 . と併用することができます。
 
正  規  表  現  君が好き.*
検索できる文字列の例
 君が好きです。  君が好きかもね。  君が好きだっちゅうの。

 この例では、「君が好き」で始り、「。」で終わる文字列を検索しています。
. は、とにかくなんでもいい1文字の意味でしたね。そして、* は、* の直前の文字がないか、連続する場合でしたね。
そこで、 .* というのは、とにかくなんでもいい1文字がまったくないか、連続するかという意味になります。とにかくなんでもいい文字が連続すると言うのは、つまりは、いろんな文字の連続と言うことになります。

そこで、上の例の場合は、「君が好き」で始り、「。」までの文字列ということになる訳です。

言わば、これが、ワイルドカードで使用される * と同じ意味を持つ正規表現ということになります。
上記の「君が好き.*。」のような使用例は、何かの文字で始り何かの文字で終わる文字列を指定する時に有用です。
+  ?  についても、それぞれ併用効果は違いますが、直前の文字が . ということでなんでもいい1文字ということになります。

それぞれ適用できる場面があるかと思いますので、考えてみて下さい(^_^)。
 
.*はどこまで繋がるのか】

さて、ここでひとつ疑問が起きます。以下の例に対して、
 


 楽しいかもね、そうかもね

以下の正規表現で検索すると、
 

正  規  表  現  楽.* 

合致するのは、「楽しいかもね」まででしょうか?それとも「楽しいかもね、そうかかもね」でしょうか?

正解は、「楽しいかもね、そうかもね」までです。
つまり、.*というのは、可能な限り合致するものまで繋がるのです。
従って、正規表現の最後に.*が来た場合は、行の最後まで合致することになります。
 

(4)いずれかの文字列  |

さて、今までの(1)〜(4)までの正規表現は、1文字に対して機能するものばかりでした。

今度は、複数の連続する文字について適用される正規表現を見ていきます。
 

正  規  表  現
 IBM|マイクロソフト|Apple|ネットスケープ
検索できる文字列の例
 IBM マイクロソフト Apple ネットスケープ

つまり、| で区切られた文字列のいずれかの文字列が存在した時に、正規表現に合致したことになります。

 この | はいくらでも並べられますが、実際は、ソフトによっては溢れて落ちてしまうこともありますので、70文字ぐらいにとどめるのが無難でしょう。

(5)指定した文字のどれか [ ]

 
例1
 明日は晴です
例2  
 明日は曇です
例3
 明日は雨です
例4
 明日は雪です
 
これらの例に対して、
 
正  規  表  現
 明日は[晴曇雨]です 

の場合は、合致するのは、例1、例2、例3です。例4は合致しません。

つまり、 [ ] で括られた中の文字は、その中のどれか1つに合致する訳です。

これが、もしも、「(1)とにかくなんでもいい1文字」のところで説明した半角の . を使用すると、
 

正  規  表  現  明日は. です 

ということになると、例1から例4までのすべてが合致します。

しかし、たとえば、すべての数字とか、すべてのアルファベットを指定したい時、
 

正  規  表  現
 [ABCDEFGHIJKLMNOPQRSTUVWXYZ]CCC 

とか、
 

正  規  表  現
 [0123456789]CCC 

と書けなくもありませんが、これは非常に面倒ですね。

まあ、これだけならばいいですが、今度は全角のABCDE…も同時に指定したい場合には、もう表現のしようがありません。

 でも、ご安心下さい。こんな場合に備えて、
 

正  規  表  現
 [A-Z]CCC 
正  規  表  現
 [0-9]CCC 

というような書きかたもあります。

この中の、 [A-Z] と言うのは、A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Zの文字のどれかということになります。同じように、[0-9]は、0,1,2,3,4,5,6,7,8,9の文字のどれかということになります。

ですので、はじめの例では、Aで始り、2番目の文字が半角の大文字のアルファベットが来て、最後はCCCの文字が来るものということになります。同じように、その次の例では、Aで始り、2番目の文字が半角の数字が来て、最後はCCCの文字が来るものということになります。

これだと、非常に複雑なことも書けますね。

この書きかたは、連続して書けますので、
 

正  規  表  現
 [A-Z0-9]CCC 

と書けば、Aで始り、次の文字が半角の大文字アルファベットか数字で、CCCで終わる文字列の検索ができる訳になります。

ところが、今度は逆に上記のはじめの例で言うと、第2番目の文字が半角のアルファベット以外を指定したい場合があります。

はい、これも実は書きかたがあります。
 

正  規  表  現
 [^A-Z]CCC 

と書けば、Aで始り、2番目は半角アルファベット以外の文字で、最後はCCCというものを探してくれます。

これもまた、連続して書けますので、
 

正  規  表  現
 [^A-Z0-9]CCC 

とすれば、2番目の文字は、アルファベットと数字以外の文字ということになります。このように[ ]の中で ^ が使用された場合は、行の先頭を表す ^ とは意味が異なりますので注意して下さい。

さて、今までの例は半角でしたが、全角の場合はどうでしょうか?
 

正  規  表  現   [か-こ]
検索できる文字列の例
  たかこ  たきこ  たけこ

この例では、2文字目は、「か き く け こ」の内のいずれかの文字が該当するはずです。

しかし、現実には、「たこ」にも「たこ」には合致します。これはどういうことでしょうか?

[か-こ]というのは、日本語の50音の並びに基づいているのではないということなのです。それは、JIS漢字コード表の並びに基づいているのです。

JIS漢字コード表の並びを見てみますと、下記のようになっています。
 

か行のJIS漢字コード表
 か が き ぎ く ぐ け げ こ
 

つまり、[か-こ]の文字というのは、単純に か き く け こ の文字ではなくて、上記の文字の中のどれかということになるわけです。

ですから、半角の場合はあまり問題になることはありませんが、全角の並びの場合は、必ずしも50音の順にはなってはいないということに注意して下さい。

できましたら、[か-こ]のような使用をされる場合は、JIS漢字コード表を参照されることをお勧めします。

ちなみに、[弌-熙]は第2水準の漢字のいずれかという意味です。

ここでちょっと注意すべき事があります。それは、[ ]の中ではメタ文字は普通の文字として認識されると言うことです。従って、メタ文字を普通の文字として探させたい場合でも、わざわざ直前に \ を付ける必要はありません。ただし、]\ につきましては例外です。以下に例を示しますと…
 

正  規  表  現  [.*] 
検索できる文字列の例  . * のいずれかの文字。いずれの文字もメタ文字ではない。
 
正  規  表  現
 [ABC^] 
 
検索できる文字列の例
 A,B,C,^ のいずれかの文字。^はメタ文字ではない。

^ は文字として認識させたい場合は、必ず[ ]の中の2番目以降に記載のこと。先頭に書くと、上記で説明したように^に続く文字を否定する意味のメタ文字になってしまいます。
 

正  規  表  現
 [^^4]
 
検索できる文字列の例
  ^ と 4 以外の文字。

このように [ ] の中の先頭文字 ^ に続く ^ はその文字自体を否定する。
 

正  規  表  現
 [[567] 
検索できる文字列の例
 [,5,6,7の文字のいずれか。
 
正  規  表  現
 [\]567] 
検索できる文字列の例
 ],5,6,7の文字のいずれか。

このように[ ] の中で [ ] の文字を指定した場合は、[ はそのままで問題ないが、] の場合は \] と記述しないと誤検索します。
 

正  規  表  現
 [\\PR] 
検索できる文字列の例
 \,P,R の文字のいずれか。

このように [ ] の中で \ の文字を指定した場合は、 \\ と記述しないと誤検索します。
 

正  規  表  現
 [-4]
検索できる文字列の例
  - と 4 の文字のいずれか。

これを逆にして
 

× 誤った正規表現
 [4-
 

とは書かないで下さい。正確に検索できません。