正規表現とはなにか?


 「いくつかの文字列を一つの形式で表現するための表現方法」で
 この表現方法を利用すれば、文章の中から容易に見つけたい文字列を
 検索することができる。

  例えば
「Windows か又はWINDOWS 次にスペースがあるか又はないか、
その後に95 が付くか、もしかすると 98 かもしれない。」
 これを、正規表現で書くと
 ★W(indows|INDOWS) ?9[5 8]と成ります。

正規表現で使用する特殊文字は「メタ(超)文字」と呼んでいます。
. ^ $ [ ] * + ? | ( )

「俺はB*** G*****が大嫌いだ!」 「俺はBeer Gardenが大嫌いだ!」
 この行に含まれている *は*そのものを意味していません、
  普通の文字として検索したい場合は、それらメタ文字の前に、
下記の例のように、\を付加しなければなりません。
\. \^ \$ \[ \] \* \+ \? \| \( \)
 なお、\ 自体は、\\と書きます。


【メタ文字の種類】

(1)「.」なんでもいい1文字     . 

   ★   私は.です 
        検索できる文字列の例   私は鳥です   私は馬です  私は0です 
        
  ★  私は...が.. 
        検索できる文字列の例   私はうどんが嫌い   私は早起きが苦手 

  ★ TEST\.LOG 
        検索できる文字列の例   TEST.LOG 

(2)行の先頭と最後  ^ $
       
       例1  今日はありがとうございました。 
       例2  ありがとうと言いたい 
       例3 君に心よりありがとう 
       これらの例に対して、

   ★   ^ありがとう 
       合致するのは例2だけとなります。 
       行の先頭に存在する「ありがとう」の文字しか検索しないのです。 

      逆に、
   ★    ありがとう$  
       $ が行の終わりを意味します。 合致するのは、例3だけ。 

      また、以下のようにこの両方を同時に指定した場合、   
   ★  ^ありがとう$  
       「ありがとう」の文字だけのある行に合致します。 
       行頭にある普通の文字の ^ 、行末にある $ を検索したい場合は、
      それぞれ 
   ★  ^^  
   ★  $$   
      ^は正規表現の先頭、$は終端のものしかメタ文字として認識されません。

(3)同じ文字の繰り返し * + ?  (* と + と ? は、少しずつ違う)
       
   ★   おー*い 
        検索できる文字列の例  おい  おーーい  おーーーーい 
        * は、* の直前の文字がないか、直前の文字が1個以上連続する。 
        注意したいのですが、
        ファイル名を指定する時のワイルドカード * とは意味が異なります。 
        ワイルドカードの * では、「おー*い」は、おーい  おーーい  おーーーーい 
        * は直前の文字がなんであろうと関係なく、
        「ー」の後の文字がまったくなくて「い」が来ているか、
        どんな文字でもいいから、1個以上の文字が「ー」の後に続いて、
        最後に「い」が来ているかが問題になります。 

   ★   おー+い 
        検索できる文字列の例   おーい  おーーい  おーーーーい 
        + の場合は、* とは違い、最低でも1個は + の直前の文字がないといけません。 
        後は、それが連続するという意味になります。 
  
   ★   おー?い 
        検索できる文字列の例  おい  おーい  
        ? の場合は、直前の文字がまったくないか、1つだけある意味です。 
        これはどういう場合に便利かと言いますと、 

   ★  Windows?  
        検索できる文字列の例  Windows   Window 
       単数形と複数形のどちらでも合致させたい場合に利用できます。 

   ★   Windows ?98   (半角のスペース) 
       検索できる文字列の例  Windows98   Windows 98 
       
(4)なんでもいい文字の連続  .*
      
   ★  君が好き.* 
      検索できる文字列の例 
      君が好きです。  君が好きかもね。  君が好きだっちゅうの。 
      「君が好き」で始り、「。」で終わる文字列を検索。 
       そこで、 .* というのは、1文字がまったくないか、
       連続するかという意味になります。 
       上の例の場合は「君が好き」で始り、「。」までの文字列ということになる。 
       ワイルドカード * と同じ意味を持つ正規表現ということになります。 

    【.*はどこまで繋がるのか】 
       さて、ここでひとつ疑問が起きます。以下の例に対して、 
              例 
       楽しいかもね、そうかもね 
  ★  楽.*ね
    「楽しいかもね、そうかもね」までです。 

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

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

(6)指定した文字のどれか [ ]
  
            例1  明日は晴です 
            例2  明日は曇です 
            例3  明日は雨です 
            例4  明日は雪です 
    ★   明日は[晴曇雨]です  
           合致するのは、例1、例2、例3です。例4は合致しません。 
           これが、もしも、「(1)とにかくなんでもいい1文字」の
           ところで説明した半角の . を使用すると、 

    ★  明日は. です  
           ということになると、例1から例4までのすべてが合致します。 
           たとえば、すべての数字とか、すべてのアルファベットを指定したい時、 
  
    ★  A[ABCDEFGHIJKLMNOPQRSTUVWXYZ]CCC  
           とか、 

    ★ A[0123456789]CCC  
           と書けなくもありませんが、これは非常に面倒ですね。 
           でも、ご安心下さい。こんな場合に備えて、 
    ★ A[A-Z]CCC  
    ★ A[0-9]CCC  
           というような書きかたもあります。 
           ですので、はじめの例では、Aで始り、2番目の文字が
           半角の大文字のアルファベットが来て、
           最後はCCCの文字が来るものということになります。
           同じように、その次の例では、Aで始り、
           2番目の文字が半角の数字が来て、
           最後はCCCの文字が来るものということになります。 
           この書きかたは、連続して書けますので、 

    ★ A[A-Z0-9]CCC  
           と書けば、Aで始り、次の文字が半角の大文字アルファベットか数字で、
           CCCで終わる文字列の検索ができる訳になります。 
           ところが、今度は逆に上記のはじめの例で言うと、
           第2番目の文字が半角のアルファベット以外を指定したい場合があります。 

           これも実は書きかたがあります。 
    ★ A[^A-Z]CCC  
           と書けば、Aで始り、2番目は半角アルファベット以外の文字で、
           最後はCCCというものを探してくれます。 

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

          さて、今までの例は半角でしたが、全角の場合はどうでしょうか? 
    ★  た[か-こ]こ 
        検索できる文字列の例   たかこ  たきこ  たけこ 
        この例では、2文字目は、「か き く け こ」の内の
        いずれかの文字が該当するはずです。 
        しかし、現実には、「たがこ」にも「たぎこ」には合致します。
        これはどういうことでしょうか? 
         [か-こ]というのは、日本語の50音の並びに基づいているのではなく、
     それは、JIS漢字コード表の並びに基づいているのです。 
     JIS漢字コード表の並びを見てみますと、下記のようになっています。 
     か行のJIS漢字コード表  か が き ぎ く ぐ け げ こ 
     つまり、[か-こ]の文字というのは、単純に か き く け こ の文字ではなくて、
    上記の文字の中のどれかということになるわけです。 
     ですから、半角の場合はあまり問題になることはありませんが、
     全角の並びの場合は、必ずしも50音の順にはなってはいないことに注意して下さい。 

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

  ★ [ABC^]  
    検索できる文字列の例  A,B,C,^ のいずれかの文字。^はメタ文字ではない。 
    ^ は文字として認識させたい場合は、必ず[ ]の中の2番目以降に記載のこと。
    先頭に書くと、上記で説明したように^に続く文字を否定する意味のメタ文字になる。 
  ★ [^^4] 
    検索できる文字列の例   ^ と 4 以外の文字。 
    このように [ ] の中の先頭文字 ^ に続く ^ はその文字自体を否定する。 
  
  ★ [[567]  
    検索できる文字列の例  [,5,6,7の文字のいずれか。 

  ★ [\]567]  
    検索できる文字列の例  ],5,6,7の文字のいずれか。 
    このように[ ] の中で [ ] の文字を指定した場合は、
    [ はそのままで問題ないが、] の場合は \] と記述しないと誤検索します。 
  
  ★ [\\PR]  
    検索できる文字列の例  \,P,R の文字のいずれか。 
    このように [ ] の中で \ の文字を指定した場合は、 
    \\ と記述しないと誤検索します。 
  
  ★ [-4] 
    検索できる文字列の例   - と 4 の文字のいずれか。 
    これを逆にして  [4-]  とは書かないで下さい。正確に検索できません。 


(7)グループ化  ( )
    今までのメタ文字は主に1文字を対象としていました。
    しかし、まとめて数文字単位で処理できると便利な場合があります。
    こんな時に便利なのが ( ) です。( ) は ( ) の中をグループ化してくれます。
    この機能は非常に強力ですので、知っていて損はないと思います。 
  
  ★ が+ーん  
    検索できる文字列の例  ががーん   ががががーん   がががーん 
    この例では、+ は直前の文字の1個以上の繰り返しなので、
    「検索できる文字列の例」のような文字列に合致します。 
    ところが、 

   ★ (じゃ)+ーん  
    検索できる文字列の例  じゃーん   じゃじゃーん   じゃじゃじゃーん 
    この例では、( ) が使用されていますが、 + の直前の文字というのは、
    従来の1文字ではなく、( )に囲まれた部分の文字列になります。 
    つまり、「じゃ」の1回以上の繰り返しということになる訳です。 
    また、 

   ★ 明日ぼく|わたしは帰宅します  
    検索できる文字列の例  明日ぼく わたしは帰宅します 
    この例では、「明日ぼく」「わたしは家に帰ります。」
    の文字列のいずれかが検索されますが、 
  
  ★ 明日(ぼく|わたし)は帰宅します 
     検索できる文字列の例 明日ぼくは帰宅します  明日わたしは帰宅します 
    この例では、まず、( ) の中を先に処理します。
    つまり、「ぼく」か「わたし」のいずれかの文字列を選びます。
    そして、( ) の外の文字列をそのまま連結します。
    すると「検索できる文字列の例」のように、2通りの文字列が検索できるのです。 
 

メタタグ記述法  ワイルドカード  トップ