こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

教えてほしいです。
$text = "1テストp41p2Ap2、テストp22、p4テストp2testp4w";
@M = ("p4","p2");
上記の2つの変数から
下記のようにする方法はありますでしょうか?
$text = "1テストp41p2A、テストp22、p4テストtestw";

※消したいワード [p4][p2]が複数ある場合
配列内の文字が複数ある場合、最初の一致だけを残しあと消す。
※[p41][p22]などの2桁の数値は消さない

投稿日時 - 2018-11-28 14:11:53

QNo.9562552

困ってます

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

スマートな表現思いつかない、とりあえず使えると思う。

$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";

投稿日時 - 2018-11-30 21:34:13

補足

ありがとうございました!
こんな方法があったのですね!勉強になります‼️

hugaの文字列は、入力の際、万一その文字列の場合別の文字列に変換させ、かぶらないようにしました!

投稿日時 - 2018-12-01 18:14:36

ANo.4

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.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";

投稿日時 - 2018-11-30 13:49:29

ANo.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";

投稿日時 - 2018-11-30 12:11:08

ANo.1

ベタな表現だけど

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

投稿日時 - 2018-11-29 17:04:54

補足

ご回答ありがとうございます。
上記のような質問の文字列ではうまくいきました。

...p4p4

みたいに連続したりすると、消えませんでした……

これはどう対処すればいいでしょうか?

投稿日時 - 2018-11-30 10:21:35