重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

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をリファレンスとして
とられてエラーになりました。

このような場合、どうすればヒットした文字のみを置換できるでしょうか。
非常に基本的なことなのですが、参考書やウェブではなかなか見つからな
かったもので。。。。

よろしくお願いします。

A 回答 (4件)

質問をざっと読んだところ、求めるところは置換ではなくて挿入ではないかと


思うのですが違いますか?

であるなら、正規表現での置換よりも substr 関数を使ったほうが
効率がよいのではないかと思います。

use strict;

my $str = 'ABCDEF';
substr($str, 3, 0, '-');
print $str;

実行例:
ABC-DEF
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/03/06 17:59

正規表現でいくなら


seq =~ s/^(.{3})/$1-/;
ですね. なんで .{2}(.) にしたのかが理解できん.
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/03/06 18:22

以下のページにカンマを3桁区切りで挿入する正規表現が載っていますので参考にして下さい。



http://www.din.or.jp/~ohzaki/perl.htm#NumberWith …

しかし、#2で述べられているように、正規表現よりもsubstrを使用したほうが簡単かつ高速です。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/03/06 18:01

ちょっと力技ですが。



my $string = 'ABCDEF';
$string =~ s/(.{3})/$1-/g;
$string =~ s/-$//;

というのはいかがでしょう。
    • good
    • 0
この回答へのお礼

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

せっかく教えていただいたのに、すみません。

お礼日時:2008/03/06 17:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!