- ベストアンサー
パターンマッチと置換
パターンマッチと置換を利用して 文章中の >○○○{△□☆} という部分を <×××>△□☆ に変えたいのですが、どのようにかいたらいいのか 教えて下さい。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
「文章中の」ということですので、{ と } に囲まれた箇所を検出する部分は {(.*?)} とした方がよいでしょう。{(.*)} だとそれ以降に } があった場合に、最後の } までの間を「任意の文字列」として認識してしまいます。 例えば、 >○○○{△□☆}▽▽{○◇} のような場合に <×××>△□☆}▽▽{○◇ となってしまいます。 また、No.2 さんのように前もって任意の文字列を調べておいて置換に利用してもよいのですが、次のように置換するその場で調べて使うこともできます。 $texts =~ s/>○○○{(.*?)}/<×××>$1/g;
その他の回答 (2)
- ysk6406
- ベストアンサー率40% (237/589)
> △□☆にあたる部分が任意の場合、どうのようにしたらいいのでしょうか。 「任意」の文字列を前もって検索・保存しておいて、置換時に参照すればいいのではないでしょうか。 つまり、 $_ = ">○○○{ここは任意の文字列です}"; print "BEFORE: ", $_, "\n"; /{(.*)}/; s/>○○○{($1)}/<×××>\1/g; print "AFTER: ", $_, "\n"; こんな感じになると思います。
お礼
このように書くんですね。勉強になりました。 2度も教えていただきまして、ありがとうございました。 今Perlの勉強中でして、今後もお世話になると思いますが、よろしくお願いします。
- ysk6406
- ベストアンサー率40% (237/589)
文章が変数 $_ に入っているとして、 s/>○○○{(△□☆)}/<×××>\1/g; で変換されます。 次のサンプルプログラム $_ = ">○○○{△□☆}"; print "BEFORE: ", $_, "\n"; s/>○○○{(△□☆)}/<×××>\1/g; print "AFTER: ", $_, "\n"; を実行すると、 BEFORE: >○○○{△□☆} AFTER: <×××>△□☆ となりますが…これで、お望みの結果でしょうか?
お礼
早速、回答していただきまして、ありがとうございます。 サンプルプログラム、確認できました。()を使うのですね。助かりました。 もう1つ伺いたいのですが、 >○○○{△□☆}において、>○○○{ }は固定で、 △□☆にあたる部分が任意の場合、どうのようにしたらいいのでしょうか。質問がわかりづらくて申し訳ないのですが、つまり、 >○○○{ }は<×××>に置換したく、{ }の中の文字列はそのまま<×××>の後に並ぶようにしたいのですが・・・。 どうぞよろしくお願いします。
お礼
回答していただきまして、どうもありがとうがとうございます。 $texts =~ s/>○○○{(.*?)}/<×××>$1/g; というふうに、置換するその場で調べて使えるのですね。 すっきりしていて、感動しました。 今Perlを勉強中な身でして、今後もお世話になると思いますが、よろしくおねがいします。