- ベストアンサー
Perl 文字の中にある複数ワードを1つにしたい
教えてほしいです。 $text = "1テストp41p2Ap2、テストp22、p4テストp2testp4w"; @M = ("p4","p2"); 上記の2つの変数から 下記のようにする方法はありますでしょうか? $text = "1テストp41p2A、テストp22、p4テストtestw"; ※消したいワード [p4][p2]が複数ある場合 配列内の文字が複数ある場合、最初の一致だけを残しあと消す。 ※[p41][p22]などの2桁の数値は消さない
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
スマートな表現思いつかない、とりあえず使えると思う。 $huga = 'HoGeHuGa'; # 検索文中にない文字列にして下さい、記号はダメ $text = "1テストp41Ap2p2p21p2p2p2、テストp22、p4p4p41p4p4テストp2testp4wp4 テストp2 pp2p41p4p4p41pp2 テスト1 p2p2pp4"; @M = ("p4","p2"); for(@M){ while(1){ $text =~ s/$_(\D|$)/$huga$1/; last if $text !~ /$_(\D|$)/; } $text =~ s/$huga/$_/; $text =~ s/$huga//g; } print"$text\n";
その他の回答 (3)
- Wap58
- ベストアンサー率33% (29/87)
訂正、No.2は文末に1度しか出ない文字まで消しちゃうから それと__HuGa__文は文中に使われてない文字列を使ってね #$text = "1テストp41Ap2p2、テストp22、p4テストp2testp4wp4"; $text = "1テストp41Ap2p2、テストp22、テストp2testpwp4"; @M = ("p4","p2"); for(@M){ $text =~ s/$_(\D|$)/__HuGa__$1/; $text =~ s/$_(\D|$)/$1/g; $text =~ s/__HuGa__/$_/; } print"$text\n";
- Wap58
- ベストアンサー率33% (29/87)
私の技術ではこれくらいです __HuGa__ で置き換える $text = "1テストp41Ap2p2、テストp22、p4テストp2testp4wp4"; @M = ("p4","p2"); for(@M){ $text =~ s/$_(\D)/__HuGa__$1/; $text =~ s/$_(\D|$)/$1/g; $text =~ s/__HuGa__/$_/; } print"$text\n";
- Wap58
- ベストアンサー率33% (29/87)
ベタな表現だけど $text = "1テストp41p2Ap2、テストp22、p4テストp2testp4w"; @M = ("p4","p2"); for(@M){ $text =~ s/(?<=$_\D)(.*?)$_(\D|$)/$1$2/g; } print"$text\n";
補足
ご回答ありがとうございます。 上記のような質問の文字列ではうまくいきました。 ...p4p4 みたいに連続したりすると、消えませんでした…… これはどう対処すればいいでしょうか?
補足
ありがとうございました! こんな方法があったのですね!勉強になります‼️ hugaの文字列は、入力の際、万一その文字列の場合別の文字列に変換させ、かぶらないようにしました!