- ベストアンサー
正規表現について
正規表現で、最初に出てきた条件に合うものだけマッチさせて置換したく、それ以降に条件に合うものがあってもマッチさせたくないのですが、どうすればいいでしょうか? 現在、オプションはつけてないのですが、最後にマッチしたものがとりだされてしまいます。 ---------------------------------------- s/aaa(.*)ccc/$1/; ・・・・・正規表現 ---------------------------- aaabbbccc : : aaadddccc : aaaeeeccc ---------- だと、eeeに置換されるのですが、bbbに置換したいです。 よろしくお願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
すみません、 この行も忘れてました。 s/aaa(.*)ccc/$1/ if (?aaa(.*)ccc?); 脳内でしかためしてないので、ちょっと自信無し。
その他の回答 (5)
while(<IN>){ $output1="$1" if/aaa(.*?)ccc/; s/aaa(.*)ccc/$1/ if (?aaa(.*)ccc?); print OUT; } を my $line=0; while(<IN>){ if ($line++==0){ $output1="$1" if/aaa(.*?)ccc/; } print OUT; } とすれば御希望の振舞いをすると思います。
- moon_piyo
- ベストアンサー率60% (88/146)
えーと while (<DATA>) { s/aaa(.*)ccc/$1/ if (?aaa(.*)ccc?); print; } __DATA__ aaabbbccc aaadddccc aaaeeeccc
お礼
ご回答ありがとうございます。 次のように書きました。 test.pl--------------------------------- #!C:\Perl\bin\perl use CGI; my $q = CGI->new; $q->charset('Shift_JIS'); print $q->header(-type => "text/html"); open(IN,"<data.txt"); open(OUT,">output.txt"); while(<IN>){ s/aaa(.*)ccc/$1/ if (?aaa(.*)ccc?); print OUT; } close(OUT); close(IN); ------------------------------------- とすると、 実行結果>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> output.txt----------------------------- bbb aaadddccc aaaeeeccc ----------------------------------- と得られました。 s/aaa(.*)ccc/$1/ if (?aaa(.*)ccc?);の$1 の値(bbb)を変数$outputに入れてIEに表示したいのですが、どうしたらいいでしょうか? よろしくお願いします。
- root139
- ベストアンサー率60% (488/809)
*などを使った場合、マッチする最大の範囲をとりますので、「/aaa(.*)ccc/」の条件では下記の様になります。 処理対象文字列例 ------------------------------------------ aaabbbccc aaadddccc aaaeeeccc ------------------------------------------ $1に入る文字列 ------------------------------------------ bbbccc aaadddccc aaaeee ------------------------------------------ これを「bbb」にするには「*」の後に「?」をつけます。 したがって下記の正規表現ではいかがでしょう? s/aaa(.*?)ccc/$1/
お礼
再度、ご回答ありがとうございます。 ご親切な説明感謝します。 早速ですが、次のように書きました。 data.txt---------------------- aaabbbccc aaadddccc aaaeeeccc -------------------------------- test.pl---------------------- #!C:\Perl\bin\perl use CGI; my $q = CGI->new; $q->charset('Shift_JIS'); print $q->header(-type => "text/html"); open(IN,"<data.txt"); open(OUT,">output.txt"); while(<IN>){ $output1="$1" if/aaa(.*?)ccc/; s/aaa(.*)ccc/$1/ if (?aaa(.*)ccc?); print OUT; } close(OUT); close(IN); print $output1; ---------------------------------------------- 実行結果>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> output.txt------------------------ bbb ddd eee ------------------------------------- IEでの表示------------------------- eee ---------------------------------- となりました。 恐れ入りますが、もう少し教えてください。 得たい実行結果は、この場合、 output.txt------------------------ bbb aaadddccc aaaeeeccc ------------------------------------- IEでの表示------------------------- bbb ---------------------------------- です。すみませんが、IEでの表示、つまり$output1 にbbbを入れたいのですが、どうすればいいでしょうか?よろしくお願いします。
- root139
- ベストアンサー率60% (488/809)
やりたい事をもう少し詳しく説明してもらえますでしょうか? 文字列の置換が目的でしょうか?それとも、マッチする文字列を取出すのが目的でしょうか? 置換が目的だとすると、期待する結果はどうなりますでしょうか? 下記の様な感じで、処理対象文字列の例と期待する結果を具体的に示してもらえるとありがたいです。 処理対象文字列例 ------------------------------------------ aaabbbccc aaadddccc aaaeeeccc ------------------------------------------ 期待する結果例A ------------------------------------------ bbb bbb bbb ------------------------------------------ 期待する結果例B ------------------------------------------ aaabbbccc aaabbbccc aaabbbccc ------------------------------------------
お礼
早いご回答ありがとうございます。 すみません、説明不足でした。 早速、引用させていただきまして、補足説明と致します。 処理対象文字列例 ------------------------------------------ aaabbbccc aaadddccc aaaeeeccc ------------------------------------------ 期待する結果例 ------------------------------------------ bbb aaadddccc aaaeeeccc --------------------------------------- と、このように一番最初にマッチしたのだけ 取り出して、あとのはそのままというように したいのですが、このようなことは可能でしょうか? 可能でしたら、どのように書けば良いのかご教授ください。よろしくお願いします。
- pon_kotu
- ベストアンサー率21% (8/38)
's/aaa.+?ccc/aaaXXXccc/' で、perl5以降ならいいようです
お礼
早いご回答ありがとうございます。 せっかくご回答頂いたのですが、私の説明不足のため もう一度やりたいことを↑で書かせていただきます。 すみませんでした。よろしくお願いします。
お礼
遅い時間ですのに、ご回答ありがとうございます。 教えていただいた方法で、得られたい結果が得られました! ありがとうございました。