- ベストアンサー
要素の多い置換
Perlでテキストデータの加工をしています。 ●あ●い●う…というデータを, ◆う◆い◆あ…に置換する場合 s/●(.*?)●(.*?)●(.*?)/◆\3◆\2◆\1/g; というやりかたをしていますが, 要素が10個以上になった場合は (つまり,\9から先は) どのように指定したらよいのでしょうか? たいへん初歩的な質問かもしれませんが, どなたかご教授ください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
${10}でよかったはずです。 後、要素が可変なら以下のように書いたほうが楽なのではと思います。 $Str = "●あ●い●う"; @vTmp = $Str =~ /●(*?)/g; print "◆".join("◆", reverse @vTmp);
その他の回答 (1)
- leaz024
- ベストアンサー率75% (398/526)
グループの数が多かったり可変だったりする場合は、各グループを配列に保存して加工します。 まず、「●あ●い●う」から「あ」「い」「う」を取り出します。 「●平仮名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; こんな感じ。
お礼
ありがとうございます! 「パターン1(?=パターン2)」の正規表現, 勉強して使いこなせるようになりたいと思います。
お礼
ありがとうございます! 数字をくくればよかったのですね。