• ベストアンサー

Perl 文字の中にある複数ワードを1つにしたい

教えてほしいです。 $text = "1テストp41p2Ap2、テストp22、p4テストp2testp4w"; @M = ("p4","p2"); 上記の2つの変数から 下記のようにする方法はありますでしょうか? $text = "1テストp41p2A、テストp22、p4テストtestw"; ※消したいワード [p4][p2]が複数ある場合 配列内の文字が複数ある場合、最初の一致だけを残しあと消す。 ※[p41][p22]などの2桁の数値は消さない

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

  • ベストアンサー
  • Wap58
  • ベストアンサー率33% (29/87)
回答No.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";

r-h-a-o
質問者

補足

ありがとうございました! こんな方法があったのですね!勉強になります‼️ hugaの文字列は、入力の際、万一その文字列の場合別の文字列に変換させ、かぶらないようにしました!

その他の回答 (3)

  • Wap58
  • ベストアンサー率33% (29/87)
回答No.3

訂正、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)
回答No.2

私の技術ではこれくらいです __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)
回答No.1

ベタな表現だけど $text = "1テストp41p2Ap2、テストp22、p4テストp2testp4w"; @M = ("p4","p2"); for(@M){ $text =~ s/(?<=$_\D)(.*?)$_(\D|$)/$1$2/g; } print"$text\n";

r-h-a-o
質問者

補足

ご回答ありがとうございます。 上記のような質問の文字列ではうまくいきました。 ...p4p4 みたいに連続したりすると、消えませんでした…… これはどう対処すればいいでしょうか?