• ベストアンサー

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

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をリファレンスとして とられてエラーになりました。 このような場合、どうすればヒットした文字のみを置換できるでしょうか。 非常に基本的なことなのですが、参考書やウェブではなかなか見つからな かったもので。。。。 よろしくお願いします。

  • Perl
  • 回答数4
  • ありがとう数4

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

  • ベストアンサー
  • 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文字ごとに"-" が入るようになってしまうようです。 せっかく教えていただいたのに、すみません。

関連するQ&A

  • マクロ(複数文字置換)についての質問です。

    現在、ExcelのA列に置換前の文字、B列に置換後の文字が入っているシート(シート名:"辞書")があります。 そのシートを辞書的役割で使用し別のシートの内容を置換したいと考えています(現在候補が1000文字程度あり、1つずつ置換をすることが難しいです) また、完全一致のみの置換、大文字とから小文字の置換も可能にし、件数も何件存在するかわかりません。 例:ABCをabcに変換したい場合、 ○ABC→abc ×ABCDEF→abcDEF のような感じです。 しかし、1つのセルの中に空白がある場合は置換可能とします。 例:ABC DEF→abc DEF このようなことは可能でしょうか? 何卒よろしくお願いいたします。

  • emacsで文字列の置換

    新しい職場で emacs を使い始めたのですが、文字列の置換をすると動作が変です。 ・abc → DEF という置換をすると、なぜか ・abc → DEFbc となってしまいます。 M-% M-x replace-string のどちらで置換しても同じです。 とても困っています!!どなたかアドバイスを!!!

  • 置換演算子を使うと空白が入ってしまう

    $test = abcdef; $test =~ s/abc//g; 上記の様に置換演算子を使って文字列の削除を行うと、 「 def」の様に、削除した文字列に半角空白が入ってしまいます。 1回や2回ならよいのですが、何回も処理を行うと、 最終的に大量の空白が挿入されてしまい、大変困っています。 なんとか削除した部分に空白を挿入しない方法はないものでしょうか? 解決法がわかる方がいらっしゃいましたら、御教授頂きたく、 よろしくお願いします。

    • ベストアンサー
    • CGI
  • 一括置換をしたい

    ワード2003を使っています。 あるテキストデータの 「ABC」という文字列を「DEF」に置換したいんです。 同様に、 「GHI」を「JKL」に、 「MNO」を「PQR」に置換したいんです。 このように3つの文字列をボタンひとつで置換するにはどのようにすれば良いでしょうか? よろしくお願い致します。

  • エクセルの複数同時置換

    エクセルで文字列を同時に複数置換することって出来ますか? たとえば、ABCという文字列があった場合、 A→1 C→2 の置換を同時にやりたいんです。 ABC→1B2 に一度に置換する方法はありますか? よろしくお願いします。

  • VBSで文字列の置換

    VBSまったくの初心者で、「そんなもんWebで調べろ」とお叱りを受けるのを承知でお聞きします。 C:¥置換¥あああ.txt のテキストファイル内にある文字列"ABC"を"DEF"に置換するVBSはどのように記述すればよいでしょうか?。 よろしくお願いいたします。

  • マッチングしたい要素同士が文字列の中で重なっている場合

    perlの正規表現マッチングでうまくいかないことがあり、質問させていただきたいと思います。 たとえば AAAAAAXBBBXCCX という文字列があって「各Xの左側に位置する6文字をすべてあつめる」ということをしたいと思っています。 この文字列では AAAAAA AAXBBB BBBXCC が自分の取り出したい文字になります。 そこで以下のようなコードを書いたのですが my $seq = "AAAAAAXBBBXCCX"; my $length = 6; my @fragmentlist ; @fragmentlist = $seq =~ /(.{$length})X/g ; foreach my $fragment (@fragmentlist ){ print $fragment , "\n"; } 実際に出力されるのは AAAAAA BBBXCC となり、 AAXBBB は認識されないようです。これはおそらくAAAAAAとAAXBBBが元の文字列の中で部分的に重なっているからだと思います。 このようなマッチング対象が文字列の中で重なっている場合は、どのようにすればすべてのパターンを集めることができるでしょうか? active perl 5.8.8 , WinXP sp2環境です。

    • ベストアンサー
    • Perl
  • 複数種類の括弧でくくられてない文字をマッチングさせたい

    Perlの正規表現で質問です。 複数種類の括弧、たとえば()、【】、[]などで囲まれていない文字をマッチングさせたいのです。 括弧は1行に複数ある可能性があり、ない場合もあります。 (abc)【def】ghi【jkl】 だとghiの部分。 【abc】【def】(ghi)jkl(mno) だとjklです。 頭に必ず括弧が来たり、括弧が一回だけなら括弧閉じるの種類をor検索ではじけるのですが、何回くるかわからないのでどうしたらいいか困っています。 方法がありましたら教えてください。

    • ベストアンサー
    • Perl
  • 文字列の置換

    JAVAであるファイル内の文字列を置換するプログラム(日本語)を作りたいのですが、 ・ ・ String h_s; FileReader h_fr = new FileReader(in_filename); BufferedReader h_br = new BufferedReader(h_fr); while(true){  h_s = h_br.readLine();  if (h_s == null){   break;  }  ●文字列を置換するプログラム● } ・ ・ ここの●文字列を置換するプログラム●にあたる適当な関数って何かありますか? たとえばperlでいうと↓みたいなものなのですが・・・ s/置換前文字/置換後文字/g よろしくお願いします。

    • ベストアンサー
    • Java
  • Excelで文字列の抽出をしたいので教えてください

    Excelで下記の文字列を抽出したいのですがどなたか教えてください 例) - abcdef xxxx ---- この場合任意の文字桁も不明で最初のブランクの後のabcdefを抽出 -- abc -- def zzz この場合任意の文字,桁も不明で2回目の'--'後のdefを抽出したいのですが宜しくお願いします

専門家に質問してみよう