• ベストアンサー

位置指定の文字マッチングと同時に置換

active perl v5.8を使用しています。 文字列のマッチングと置換について質問させてください。 たとえば"ABCDEF"という文字列があったとします。この文字列の3文字目の 後に"-"(スペースバー)を入れたいと思います。"ABC-DEF"のように。 この場合文字の種類ではなく、文字の位置から置換する対象を決めること にしたいのです。 正規表現をつかい3文字目を見つけ、3文字目 + "-"に置換すればよいと考えました。 my $seq = "ABCDEF"; $seq =~s/.{2}(.)/$1-/; #3番目の文字を(.)に入れて記憶 としたのですが、こうすると(C-DEF)のように初めのほうの文字が消えてしまいます。(スクリプトを見直してみると当然なのですが。。。) 後方参照という方法で $seq =~s/.\3/$1-/; というふうにもしたのですが、 "Reference to nonexistent group in regex"と\3をリファレンスとして とられてエラーになりました。 このような場合、どうすればヒットした文字のみを置換できるでしょうか。 非常に基本的なことなのですが、参考書やウェブではなかなか見つからな かったもので。。。。 よろしくお願いします。

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

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

質問をざっと読んだところ、求めるところは置換ではなくて挿入ではないかと 思うのですが違いますか? であるなら、正規表現での置換よりも substr 関数を使ったほうが 効率がよいのではないかと思います。 use strict; my $str = 'ABCDEF'; substr($str, 3, 0, '-'); print $str; 実行例: ABC-DEF

hydrozoa
質問者

お礼

substrはなにか文字列を取り出すことにしか使ったことがありませんでした。 0指定で文字の置き換えもできるんですね。これはシンプルにわたしのした かったことができました。 ありがとうございました。

その他の回答 (3)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

正規表現でいくなら seq =~ s/^(.{3})/$1-/; ですね. なんで .{2}(.) にしたのかが理解できん.

hydrozoa
質問者

お礼

"^"をつけて頭から3文字というふうにすればよかったんですね。 >なんで .{2}(.) にしたのかが理解できん. 見返してみると変ですね。。。。 「n文字目を括弧にはさんで$1に記憶」というのが大前提にあって、 そのために書いたのですが、そちらのスクリプトのほうがシンプルで 合理的ですね。

  • bgbg
  • ベストアンサー率53% (94/175)
回答No.3

以下のページにカンマを3桁区切りで挿入する正規表現が載っていますので参考にして下さい。 http://www.din.or.jp/~ohzaki/perl.htm#NumberWithComma しかし、#2で述べられているように、正規表現よりもsubstrを使用したほうが簡単かつ高速です。

hydrozoa
質問者

お礼

非常に詳しく解説されているサイトですね。参考にさせてもらいます。 ありがとうございました。

回答No.1

ちょっと力技ですが。 my $string = 'ABCDEF'; $string =~ s/(.{3})/$1-/g; $string =~ s/-$//; というのはいかがでしょう。

hydrozoa
質問者

お礼

ありがとうございます。 質問の仕方が悪かったのですが、これは文字列がもっと長くても 3文字目のみを処理するということがしたかったのです。 ですので、教えていただいたスクリプトでは3文字ごとに"-" が入るようになってしまうようです。 せっかく教えていただいたのに、すみません。