正規表現
正規表現の細かい規則なんかは、逆引き Ruby やリファレンスのサイトを見るとして、自分で使ったもので、覚え書きしておきたいものををメモしていく。
後方参照
後方参照とは、正規表現中で () でくくった部分にマッチした文字列を参照することで、正規表現中で \1, \2, というように
半角のバックスラッシュ+数字の組み合わせ。数字は、何番目の括弧かを表す。これは、正規表現中と gsub での置換する文字列に使える。
だから、/(ab)\1/ だと /abab/ と同じになるはず。これは、括弧でくくった ab にマッチした文字列、つまり ab を \1 で参照している。
gsub を使って、次のような置換をすると、
"This is a test.".gsub(/t(\w+)[t|s]/i,'\1\1') => "hihi is a eses."
となる。ちなみに i は IGNORECASE、つまり、大文字小文字無視のオプション。
これを使うと RubyCocoa でアプリケーションで正規表現を使った置換ができるようになる。OgreKit でもいいんだけど、標準で使えないし、
RubyCocoa だと、Ruby の正規表現が使えるから、それで事足りるし。
これ以外に、正規表現でマッチさせた後にマッチした文字列だけじゃなくて、それに付随するいろいろな情報が得られる。
あと、$~ という MatchData オブジェクトを返すので、それからまたいろいろな情報が得られる。
$~.begin(n)
これで、マッチした部分の index が得られる。Ruby だから、そこまでのバイト数なんだと思うけど。
0はマッチした全体、1、2、3は括弧でかこった1番目、2番目、3番目の部分。これは、String#match でも String#scan でも使えるようだ。
$~.end(n)
begin が始まりなら、end は終わりの index。
$~.offset(n)
これを使うと、文字列の最初と最後の index が配列で返ってくる。
String#gsub(reg,string) は、ブロックで処理することもできて、複雑な置換ができる。
a.gsub(reg){|x|
処理
}
てな感じ。x には正規表現全体にマッチしたものが入り、$1、$2 など上に書いたような後方参照の値が得られる。それで、最後に返された値で置換が行われる。