にたまごほうれん草アーカイブ

はてなダイアリーで書いてた「にたまごほうれん草」という日記のアーカイブです。現在は「にたまごほうれん草ブログ」を運営中です。

今日のお勉強 - Javaで正規表現

今日はアルゴリズム編その1、正規表現

JavaRubyPerlといったスクリプト言語と比べて、正規表現を記述するのが面倒だなぁ、というのが第一印象。それだけに動作させたときに「きっちり」やった感がすごくある。
大規模な開発ではこの「きっちり」感が保守性とかを保つのに必要なのかもしれないと思った。

おまけ:Rubyで書いた場合と比較してみる

この練習問題で作った正規表現ロジックをRubyで書いたらどうなるか、と思ってついでにやってみた。
まず、ロジックの内容はテンプレートエンジンみたいな感じ。

文字列中の「%0」〜「%9」にマッチした部分を、配列に格納した文字列に置換するプログラムを作成しましょう。「%」の後の番号と、配列 data の添え字番号が対応するようにします。

Java練習問題集:アルゴリズム編(1)

Javaで作った際のこの部分のコードはこんな感じ。Matcherはスクリプト言語での正規表現の扱いに慣れている人には直感的に使いにくい。(dataという変数には、置換用の文字列が配列で格納されている)

    public String replacePattern(String body) {
        StringBuffer sb = new StringBuffer();
        Pattern p = Pattern.compile("%([0-9])");
        Matcher m = p.matcher(body);
        while (m.find()) {
            int num = Integer.parseInt(m.group(1));
            m.appendReplacement(sb, data[num]);
        }
        m.appendTail(sb);
        return sb.toString();
    }

Rubyの場合は、こんな感じ。

  def replacePattern(body)
    body.gsub(/%([0-9])/) {|s|
      @data[$1.to_i] if @data
    }
  end

ちょっとだけ、ああーってなった。

Rubyのコード全体

念のため以下に貼っときます。

data = [ "山田", "太郎", "090-XXXX-XXXX", "yamada@example.com", "1973/08/17",
         "123-4567", "山田市太郎町12-7", "株式会社XXXXXXX", "営業部", "部長" ];

body = "%7%8%9、%0 %1様:\n"
body += "  %0さまのメールアドレスは「%3」と伺っておりますので、\n"
body += "  こちらのアドレスにメールを出させていただいております。"

class Replacer
  def initialize(d=nil)
    @data = d
  end

  def setData(d)
    @data = d
  end

  def replacePattern(body)
    body.gsub(/%([0-9])/) {|s|
      @data[$1.to_i] if @data
    }
  end
end

r = Replacer.new(data)
puts r.replacePattern(body)