• ベストアンサー

要素の多い置換

Perlでテキストデータの加工をしています。 ●あ●い●う…というデータを, ◆う◆い◆あ…に置換する場合  s/●(.*?)●(.*?)●(.*?)/◆\3◆\2◆\1/g; というやりかたをしていますが, 要素が10個以上になった場合は (つまり,\9から先は) どのように指定したらよいのでしょうか? たいへん初歩的な質問かもしれませんが, どなたかご教授ください。

質問者が選んだベストアンサー

  • ベストアンサー
  • sisya
  • ベストアンサー率39% (97/244)
回答No.1

${10}でよかったはずです。 後、要素が可変なら以下のように書いたほうが楽なのではと思います。 $Str = "●あ●い●う"; @vTmp = $Str =~ /●(*?)/g; print "◆".join("◆", reverse @vTmp);

y_yoshida
質問者

お礼

ありがとうございます! 数字をくくればよかったのですね。

その他の回答 (1)

  • leaz024
  • ベストアンサー率75% (398/526)
回答No.2

グループの数が多かったり可変だったりする場合は、各グループを配列に保存して加工します。 まず、「●あ●い●う」から「あ」「い」「う」を取り出します。 「●平仮名1文字」というパターンなら、   @word = $str =~ /●(..)/g; で取れるのですが、「平仮名1文字」の部分が「文字数不定の文字列」となると   @word = $str =~ /●(.+?)(?=●|$)/g; のようにしなければなりません。 この「パターン1(?=パターン2)」は Perl5 の正規表現拡張構文の1つで、後方にパターン2が続くパターン1にマッチします。 また、g オプションをつけることで、$str 内の全てのマッチするグループを取り出します。 (つけないと、最初の「あ」しか取り出せません。) このようにして取り出した文字列の配列を reverse で逆順にし、各要素の頭に「◆」を付けて、文字列連結をします。 つまり、   @word = $str =~ /●(.+?)(?=●|$)/g;   @word = reverse @word;   @word = map "◆$_", @word;   $str = join '', @word; となります。 1行にまとめると   $str = join '', map "◆$_", reverse $str =~ /●(.+?)(?=●|$)/g; こんな感じ。

y_yoshida
質問者

お礼

ありがとうございます! 「パターン1(?=パターン2)」の正規表現, 勉強して使いこなせるようになりたいと思います。

関連するQ&A