■Windows版Perlの細道・けもの道

■ナビゲータ

[南北館(最初のメニュー)]

  1. [Windows版Perlの細道・けもの道]
    1. [1.準備編]
    2. [2.基本編]
      1. [2-1.基本処理]
      2. [2-2.キーブレイク処理]
      3. [2-3.マッチング(照合)処理]
      4. [2-4.ソート(並べ替え)処理]
      5. [2-5.パターンマッチ処理]
        1. [2-5-1.いろいろな正規表現(その1)]
        2. [2-5-2.いろいろな正規表現(その2)]
        3. [2-5-3.いろいろな正規表現(その3)]
    3. [3.応用編]
    4. [スクリプトと入力データのサンプル]
rubyではどう処理する?
同じことをrubyではこうしています。

2.基本編

2-5.パターンマッチ処理

Perlは本来、テキストデータを処理するものです、その中でも最も強力なものがパターンマッチ処理です。パターンマッチ処理とは、文字列の中に特定のパターンと一致する部分があるかどうかを調べることです。パターンと一致した場合に条件を分岐させたり、文字列を置き換えたりすることができるようになります。

正規表現のマッチング

以下の例では、「文字列」の中に「正規表現」で指定した内容と一致する部分があったときに、判断を分岐させるときの例を上げています。 (モード修飾子は英大文字と小文字の区別を無視したりするとき等、パターンマッチの方法を一部変更するときに使います。)

    【正規表現がマッチする場合】

    if  (変数  =~  /正規表現パターン/モード修飾子)    {
         マッチしたときに実行する命令
    }

    【正規表現がマッチしない場合】

    if  (変数  =!  /正規表現パターン/モード修飾子)    {
         マッチしないときに実行する命令
    }
   

正規表現パターンが複数あった場合は、先頭に近いものが選ばれます。マッチすると、式の値は「真」になり、マッチしないと「偽」になるので、if文の条件式にもなります。なお、「 =~ 」の「 ~ 」(チルダ)は、「 ^ 」キー(ひらがなの「へ」のキー)でシフト(Shift)キーを押したまま「 ^ 」キーを押して入力します。

上記のように区切り文字は通常、"/"を使用します。このため、「正規表現パターン」の中に"/"がある場合は、区切り文字との区別がつかなくなるため、"\/"と変更します。ただし、区切り文字を"/"以外にすれば、このような変更を行う必要もなくなります。"/"以外の区切り文字は、「英数字と"_"(アンダーバー)」以外の文字ですが、具体的には、"!"・"#"・"$"・"%"・"&"・ "*"などを使用することができます。ただし、"/"のときと同じように、区切り文字に"#"を使い、「正規表現パターン」に"#"を使用する場合は、「正規表現パターン」の中の"#"は"\#"と変更します。

また、かっこなどを使用することができますが、"("と")"、"<"と">"、"{"と"}"、"["と"]"は必ず対応させて使用します。

したがって、以下のようにすることができます。

    if  (変数  =~  !正規表現パターン!モード修飾子)    {
         マッチしたときに実行する命令
    }

    if  (変数  =~  #正規表現パターン#モード修飾子)    {
         マッチしたときに実行する命令
    }

    if  (変数  =~  $正規表現パターン$モード修飾子)    {
         マッチしたときに実行する命令
    }

    if  (変数  =~  %正規表現パターン%モード修飾子)    {
         マッチしたときに実行する命令
    }

    if  (変数  =~  &正規表現パターン&モード修飾子)    {
         マッチしたときに実行する命令
    }

    if  (変数  =~  *正規表現パターン*モード修飾子)    {
         マッチしたときに実行する命令
    }

    if  (変数  =~  (正規表現パターン)モード修飾子)    {
         マッチしたときに実行する命令
    }

    if  (変数  =~  <正規表現パターン>モード修飾子)    {
         マッチしたときに実行する命令
    }

    if  (変数  =~  {正規表現パターン}モード修飾子)    {
         マッチしたときに実行する命令
    }

    if  (変数  =~  [正規表現パターン]モード修飾子)    {
         マッチしたときに実行する命令
    }

   

パターンマッチでエラーになってしまう場合には、全角文字が含まれていたり、スクリプトが"shift_jis"である場合がよくあります。その場合は、スクリプトをutf-8などに変更し、スクリプト上で"use UTF8;"と指定することで回避できる場合があります(スクリプトと入力ファイルの文字コードは一致させておいたほうがエラーになりにくくなります)。

正規表現による文字列の置換

また、文字列を検索したり、検索した文字列を別の文字列に置き換えたりすることもできます。

以下の例では、「変数」の中に「正規表現」で指定した内容と一致する部分があれば、「置き換える文字列」に変更するときに使います。 (モード修飾子は英大文字と小文字の区別を無視したりするとき等、パターンマッチの方法を一部変更するときに使います。)

    変数  =~  s/正規表現/置き換える文字列/モード修飾子;
   

文字列の置換でも、区切り文字は通常、"/"を使用します。このため、「正規表現パターン」の中に"/"がある場合は、区切り文字との区別がつかなくなるため、"\/"と変更します。ただし、区切り文字を"/"以外にすれば、このような変更を行う必要もなくなります。"/"以外の区切り文字は、「英数字と"_"(アンダーバー)」以外の文字ですが、具体的には、"!"、"#"、"$"、"%"、"&"、"*"などを使用することができます。

また、かっこなどを使用することができますが、"("と")"、"<"と">"、"{"と"}"、"["と"]"は必ず対応させて使用します。

正規表現による文字の置換

また、文字列ではなく、「文字」を置き換える場合は以下のようになります。

    変数  =~  tr/文字/対応する文字/モード修飾子;
   

モード修飾子には、以下のようなものがあり、それぞれ以下のような意味があります(他にもいろいろなモード修飾子があります)。

    g   マッチするものすべてを置き換える。
        (モード修飾子gを付けないと、先頭に近いものが1つだけ置き換えられる)
    i   大文字と小文字の違いを無視する。
    x   正規表現の中コメントを無視する。
    o   パターンの再コンパイルを一度だけ行う。
   

このうち、モード修飾子"o"は、以下のような場合に使います。

正規表現パターンを変数で指定した場合、Perlではパターンマッチするごとに毎回、前処理(コンパイル)を行いますので、処理効率が低下しますが、このオプションを指定すると、Perl実行時に1回だけ前処理(コンパイル)を行うため、処理効率が上がります。このような場合に、モード修飾子"o"を使います。

正規表現に全角文字を含む場合のマッチングや置換

正規表現に全角文字を含む場合のマッチングや置換を行う場合は、スクリプトをshift_jisにしていると、エラーになることがありますので、スクリプトをutf-8などに変更し、スクリプト上で、"use UTF8;"と指定し、必要に応じて、入力ファイルも"UTF-8"に変更しておきます。具体的には[3-5-3.文字コードの変換(open プラグマ 使用)]を参照してください。また、同じフォルダ内のファイルを一括して変更する場合については、[[3-3-3.フォルダ内のファイルについて一括変更をする]を参照してください。




Copyright (c) 2010-2013 Mitsuo Minagawa, All rights reserved.