Perlの正規表現 ~置き換え マッチング
あやしいタイトルがついているかもしれませんが気にしないで下さい。ここには私が学んだPerlの正規表現の切れ端を記しておきます。切れ端でありますのでここを見てくださっている人に教えるという形にはなっていないと思います。言ってみれば自分の為のメモみたいな感じです。この点を理解してください。まず簡単で実用的なものから・・・中野美奈子アナの愛称はナカミです。 を 中野美奈子アナの愛称はみなぽんです。 と 言う文に置き換えたい場合。$strという名前の変数を使って$str = "中野美奈子アナの愛称はナカミです。";$str =~ s/ナカミ/みなぽん/; # s/置き換えする対象の文字列/置き換えする文字列/;この記述になります。つまりナカミをみなぽんに変えろという命令をしているんですね。この置き換え作業は一回しか行われません(この記述では)。次に・・・ナカミはかわいいです。だからナカミにうっとしてしまいます。 を みなぽんはかわいいです。だからみなぽんにうっとしてしまいます。 と 言う文に置き換えたい場合は$str = "ナカミはかわいいです。だからナカミにうっとしてしまいます。";$str =~ s/ナカミ/みなぽん/;と今学んだ知識で記述すると一つ問題がおきますね。この記述だと最初の ナカミ しか置き換えされません。ではどうしたらいいか。そこで置き換えの一行を$str =~ s/ナカミ/みなぽん/g;と変えてみます。後ろの方に g と文字がつきましたがこれは置き換えを文字列全体の範囲で行えという意味です。つまり対象の文字列に置き換えしたい文字列が入っている場合は全て置き換えせよという命令です。今度は対象の文字列が存在するときのみ実行する条件文を作りましょう条件文は if(条件){実行} ってやつです。中野美奈子アナの愛称はナカミです。 や 中野美奈子アナの愛称はみなぽんです。という2つの文に ナカミという文字列が含まれていたらその文字列をプリントする動作をさせるには$str1 = "中野美奈子アナの愛称はナカミです。";$str2 = "中野美奈子アナの愛称はみなぽんです。";if( $str1 =~ /ナカミ/ ){ print "$str1"; }if( $str2 =~ /ナカミ/ ){ print "$str2"; }このように条件文を書きます。プリントされるのは中野美奈子アナの愛称はナカミです。だけです。これを配列を使って簡単に記述すると@str = ("中野美奈子アナの愛称はナカミです。","中野美奈子アナの愛称はみなぽんです。");foreach(@str){ if( $_ =~ /ナカミ/ ){ print "$_"; } }この記述はforeachと呼ばれる関数を使い慣れている人なら思いつくでしょうね。(下にこの関数の補足をつけておきました。)今までは置き換えする対象の文字列が決まっていました。 < ナカミ今度は上の記述の仕方で ナカミ と みなぽん という文字列が含まれていた時にプリントする動作をするには@str = ("中野美奈子アナの愛称はナカミです。","中野美奈子アナの愛称はみなぽんです。");foreach(@str){ if( $_ =~ /ナカミ|みなぽん/ ){ print "$_"; } }という様に記述します。 ナカミ|みなぽん という記述は |という論理和(OR)の記号を使って ナカミ または みなぽん だったらということを示しています。この記述だと今度は2つの文がプリントされますね。これ中々複雑な記述かな?さらに発展させると曖昧な条件でも動作する条件文を作る事ができます。上の記述で配列に入っている2つの文字列は内容が似ていますね。 中野美奈子アナの愛称は???です。の???に ナカミ が入ったり みなぽんが入っているわけです。この中野美奈子アナの愛称は???です。という条件で上と同じように動作させる場合にはこの様にします。@str = ("中野美奈子アナの愛称はナカミです。","中野美奈子アナの愛称はみなぽんです。");foreach(@str){ if( $_ =~ /中野美奈子アナの愛称は.*です。/ ){ print "$_"; } }???の部分が変な記号に変わっているけど .は何でも良い一文字を示し、*は直前の一文字を何回か(0回~)繰り返すとい意味です。この考えは難しいです。これが正規表現ってやつです。もちろん2つの文がプリントされます。さらに 中野美奈子アナの愛称はです。という文字列もマッチング(条件にあっているとみなされる)されます。上の2つの文字列で ナカミ と みなぽん という文字列だけをプリントしたい場合はどうしたらいいかそれはまた特殊な書き方をしないといけないだけどこの様になります。@str = ("中野美奈子アナの愛称はナカミです。","中野美奈子アナの愛称はみなぽんです。");foreach(@str){ if( $_ =~ /中野美奈子アナの愛称は(.*)です。/ ){ print "$1"; } }???の部分に新たな記号がつきましたね。 .* を (.*)とすることによってグルーピング(この用語が正しいかわからないけど)が出来ます。このグルーピングした部分は後から参照する事が出来ます。その参照をする変数(特殊変数)が $1 です。これで ナカミ と みなぽん という文字列だけがプリント出来ます。今日はここまで補足foreach関数はwhile関数やfor関数に書き換えることが出来ますforeach(@str){ print "$_"; }は$n = 0; $sn = @str; while($n < $sn){ print "$str[$n]"; $n++; } や$sn = @str; for($i=0;$i