今日のお勉強 - Javaで正規表現
JavaはRubyやPerlといったスクリプト言語と比べて、正規表現を記述するのが面倒だなぁ、というのが第一印象。それだけに動作させたときに「きっちり」やった感がすごくある。
大規模な開発ではこの「きっちり」感が保守性とかを保つのに必要なのかもしれないと思った。
おまけ: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)