• ベストアンサー

元の文字列をそのまま使う置換方法を教えてください。

perlの置換で『aaa』の文字列にマッチする行を置換するにはどうしたらよいでしょうか。 宜しくお願いします。 1.『aaa』にマッチする 1111*aaa2222 2.『aaa』にマッチしない 1111*aaa\2222  1111*aaa_2222   1111,2222には数字や英文字が入ります。 また1.を置換するときに 1111*aaa2222cccc と元の文字列をそのまま使い『ccc』を追加する場合は 置換先はどのように書けばよいでしょうか。 現在正規表現を勉強中で、簡単なことでしたら申し訳ありません。 ヒントでもかまいませんので是非お教え願います。

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

  • ベストアンサー
  • Ki4-U2
  • ベストアンサー率81% (364/446)
回答No.2

まず、'*'や'\' は正規表現や perl で特別の意味を持ちますが、そうではない単なる文字であれば、'\'を前置します("\*"、"\\")。 ここでは単なる文字と推測して説明を続けます。 1111、2222の部分が「数字、英小文字、英大文字が1個以上並んだもの」だとすると、 [A-Za-z0-9]+ と表現できます。したがって全体の表現は [A-Za-z0-9]+\*aaa[A-Za-z0-9]+ perl では、()を使って、マッチした文字列を再利用できます。 たとえば、上記にマッチしたときだけ、後ろに『ccc』を追加するなら、 s/([A-Za-z0-9]+\*aaa[A-Za-z0-9]+)/$1ccc/ $1 というのが、()でくくられた部分にマッチした文字列です。 応用として、マッチしたときだけ『aaa』を『ccc』に置換したいときは、 s/([A-Za-z0-9]+\*)aaa([A-Za-z0-9]+)/$1ccc$2/ により実現できます。 1111、2222の部分が記号、空白文字なども含んだ任意の文字の羅列(ただし、2222の最初の文字は'\'、'_'以外)ということであれば、  1111 の部分は .+  2222 の部分は [^\\_].* で表現できます。 s/(.+\*aaa[^\\_].*)/$1ccc/ なお、'('や')'を文字として使いたいときは、やはり'\'を前置する必要があります。

2002hare
質問者

お礼

お礼が遅くなり申し訳ありません。 当時は大変助かりました。ありがとうございます。

その他の回答 (2)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

例として書かれているのは、置換すべき行のサンプルで、書こうとした正規表現ではないのですよね。 1.の例にはマッチするが、 2.の例にはマッチしない正規表現がわからないということなのでしょうか? また、置換は、行全体を置換するのでしょうか、aaaを置換するのでしょうか? 最後の場合は、マッチした全体に文字を付加する置換ですがそういうことでしょうか?

2002hare
質問者

お礼

お礼が遅くなり申し訳ありません。 当時は大変助かりました。ありがとうございます。

  • okiyoshi
  • ベストアンサー率34% (11/32)
回答No.1

my $str = '1111*aaa2222'; my $match_str = 'aaa'; my $join_str = 'cccc'; $str = "$str$join_str" if $str =~ /\Q$match_str\E/; print "$str\n";

2002hare
質問者

お礼

お礼が遅くなり申し訳ありません。 当時は大変助かりました。ありがとうございます。

関連するQ&A

専門家に質問してみよう