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

■ナビゲータ

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

  1. [Windows版Rubyの細道・けもの道]
    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. [スクリプトと入力データのサンプル]
Perlではどう処理する?
同じことをPerlではこうしています。

2.基本編

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

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

正規表現のマッチング

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

   

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

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

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

    s   正規表現の文字列をShift_JISとしてマッチする
    e   正規表現の文字列をEUC-JPとしてマッチする
    u   正規表現の文字列をUTF-8としてマッチする
    n   正規表現の文字列を1バイト文字としてマッチする
    i   大文字と小文字の違いを無視する。
    x   正規表現の中の空白やコメントを無視する。
    o   パターンの再コンパイルを一度だけ行う。
   

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

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

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

以下の例では、「変数」の中に「正規表現」で指定した内容と一致する部分があれば、「置き換える文字列」に変更するときに使います。subメソッドは、正規表現に最初にマッチした文字列だけを置き換えますが、gsubメソッドは正規表現にマッチしたものすべてを置き換えます。

    変数.sub(/正規表現/,置き換える文字列)   
変数.gsub(/正規表現/,置き換える文字列)

また、置き換えた結果を保存したいときは、sub!メソッドやgsub!メソッドを使うか、別の変数に代入します。

    変数.sub!(/正規表現/,置き換える文字列)   
変数.gsub!(/正規表現/,置き換える文字列)
別の変数 = 変数.sub(/正規表現/,置き換える文字列)
別の変数 = 変数.gsub(/正規表現/,置き換える文字列)



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