• ベストアンサー

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

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

  • Perl
  • 回答数4
  • ありがとう数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 みたいに連続したりすると、消えませんでした…… これはどう対処すればいいでしょうか?

関連するQ&A

  • VBA Functionプロシージャで複数の値を

    エクセルでVBAのFunctionプロシージャについて複数の値を戻り値として 受け取る方法を考えています。 下記のようなサンプルプログラムを作りました。 --------------------------------------------------------------------------------- Option Explicit Private Sub CommandButton1_Click() Dim kekka(3) As Double Dim txt As String txt = "12.12A,34.34B,56.56C,78.78D" kekka(0) = test(txt) End Sub Public Function test(ByVal text As String) As Double Dim txt_kakou(3) As String '## 渡された「txt = "12.12A,34.34B,56.56C,78.78D"」を加工し、数値のみを取り出し '## 下記のように配列txt_kakou(3)に振り分ける '## 加工方法は割愛 txt_kakou(0) = 12.12 txt_kakou(1) = 34.34 txt_kakou(2) = 56.56 txt_kakou(3) = 78.78 'string型からdouble型に変換する。 txt_kakou(0) = CDbl(txt_kakou(0)) txt_kakou(1) = CDbl(txt_kakou(1)) txt_kakou(2) = CDbl(txt_kakou(2)) txt_kakou(3) = CDbl(txt_kakou(3)) test = txt_kakou() End Function ----------------------------------------------------------------------------------- まず、呼び出し側のプロシージャでkekka(3)という配列を宣言します。 次に変数txtに「"12.12A,34.34B,56.56C,78.78D"」の文字列を代入します。 そして変数txtをFunctionプロシージャに投げます。 Functionプロシージャでは、受け取った「"12.12A,34.34B,56.56C,78.78D"」 を数値のみに分解し、4つの変数に代入します。 この4つの変数も配列で用意し、txt_kakou(3)とします。 このtxt_kakou(3)を呼び出し元に返し、呼び出しもとの変数kekka(3)に入れたいのです。 また、はじめ変数txtに代入される値は文字列ですが、この文字列をFunctionプロシージャで分解し、 分解した値は、最終的には数値として扱いたいので、途中でdouble型に変換しています。 これを実行すると、Functionプロシージャの最後のtest = txt_kakou()で、型が一致しません といわれてしまいます。 どのように書き直せばいいのでしょうか。 よろしくお願いします。

  • シェルの文字列取得について

    シェル(Bash)の文字列取得についてご教授ください。 文字列:  test(12345) 上記の文字列から"12345"(括弧内の数値部分)を取り出し、変数へ格納する場合、どのように行えばよいのでしょうか? ちなみに1桁だったり2けただったりと数値の桁は変動します。 よろしくお願いします。

  • perl 複数ファイルから一行ずつ読み込んで比較

    初心者向けのperl参考書がなんとか理解できる程度のperl初心者です。 一週間ほど思考錯誤してきたのですが、いくらスクリプトを書いてもどうしても自分では解決できない処理がありましたので、初めてなのですが、質問させていただきました。 二つの同じ形式の、一部情報だけ異なるファイルから一行ずつ配列を読み込んで、数値の大小を比較したいのですが・・・ ファイル構造は、下のように2行でひとつのtextデータの情報を表示する形式となってまして、 奇数行には、各textファイルの情報が、.以下の部分に4552221.2:(30.2):100、のように記載されています。 偶数行には、各テキストファイルの、IDとなる情報が、13333331のように記載されています。この奇数行と、偶数行一行ずつで、ひとつのtextデータの 情報を表しています。textというファイルは、text1から順に,text2000000まで、 2000万程度,行で言えば4000万行ほど存在しています。よって、file1もfile2も、同じ行であれば、同じtextで、同じIDのものを示しています。ずれはありません。 file1 ----------------------------- >text1. 4552221.2:(30.2):100 13333331 >text2 87999999 >text3. 3444444.1:(20.0):300 75533333 ----------------------------- 数値は意味が変わらない範囲で、比較しやすい数値に変えてあります。 この上のfile1と、下のfile2を比べたいのですが、 file2 ----------------------------- >text1. 4552221.2:(20.9):100 13333331 >text2 87999999 >text3. 3444444.1:(23.3):300 75533333 ----------------------------- 偶数行のtextファイルの欄が大事で、text名のドット(.)の後に、続けて数値が書いてある場合(上ではtext1とtext3が該当)、そのドットの後の括弧()で囲まれた中の数値の大小を比較して、 差が一定以上あるtextだけを出力するスクリプトが書きたいと思っているのですが、 これをいきなりすべてひとつのスクリプトにまとめるのは、私の知識と力量では到底無理なので、ひとつひとつ段階を踏んで処理していこうと考えました。 1、奇数行の、text.の後半に情報があるもの場合、tempファイルにその奇数行と、対になる偶数行を出力する。それを、file1、file2、個別に行う。(temp1、temp2を出力) file1で取り除かれる3、4行目のtext2は、file2でも必ず取り除かれるので、1の処理後も、file1と2の各行は、比較することが可能な状態です。 2、正規表現を使って、各行の()で囲まれた部分の最初の2桁の数字(一部は一桁の数字の場合もあり)、をtempに出力する。(temp3、temp4を出力) (この処理を行わなくても可能かもしれませんが、ややこしいので、数字だけ出すようにしました) 最後に、file1とfile2の各行の数字を一行ずつ読み込んで、数値に一定以上の差がある行の情報だけ出力したいのですが、各行を順番に分析できる方法は、while文か、配列に読み込む方法しか知りません。 前者のwhile文では、ファイルオープンは、ひたつ以上は同時には取り扱えないという情報を得たので、使えない思っています。後者の配列に読み込む方法は、桁が大きいので、実用的ではないと感じています。 二つ以上のファイルの各行の特定の数値データを、一行ずつ順に比較して、差があるものだけ抽出するにはどのようなスクリプトを書けばよいのか、ご教授下さい。 いろいろ調べましたが、(僕の調べ方が悪いと思いますが)適切なコマンドや方法にたどり着けません。 試してみた方法 ファイルハンドルを二つ指定して、while文の条件中に、andで条件を二つ指定してファイルハンドルから読み込んでやればよいと思ったのですが、実行するとエラーになってしまいます。ググっていろいろ調べてみたところ、ファイルハンドルの二つ指定はできないとの記述を見つけたので、whileの条件に複数のファイルハンドルを記述するこの方法はあきらめて、ここで、ストップしています。 まわりに、perlを扱える方がいらっしゃれば質問に伺うのですが。もしよろしければ、簡単でもご教授いただけますと幸いです。宜しくお願い申し上げます。

    • ベストアンサー
    • Perl
  • perlの文字列操作について教えてください

    perl初心者です。 変数$hogeに下記のような値が入っていた場合に、 ttp://***の部分を1つずつ取り出して、配列に 代入する方法を教えてくださいm(_ _)m $hoge = ttp://aaaa ttp://bbb ttp://ccc

  • クラスメンバの中で配列を利用したい

    Cで書いたプログラムをC++に移植してます。 普通の変数はクラスメンバに置き換えてしまえばよろしいのですが、 配列の場合そのままクラスメンバに置き換えたら 問題が発生します。(予想はついていたのですが…) class test{ private: int m_test[100]; }; クラスメンバを配列に設定するにはどうすればよいですか?

  • PHPの文字列の中に<>を入れると、その中が消える

    PHP初心者です。 例えば、下記のように変数に文字を入れたいです。 $text = "aaa<bbb>"; そうすると、なぜか、<>の中身が消えてしまうのですが、 このような場合、どうしたら良いでしょうか? echo $text; とすると、 aaa し表示されません。 試しに、 $text = "aaa<bbb>ccc"; とすると、aaaccc と表示されます。 ちなみに、mail()関数の中のheader要素を代入する際にこの問題にぶちあたっています。 smartyを使っています。※初期設定のみで何もしていません。 分る方がいましたら、ご助言いただけるとうれしいです。

  • 配列にある文字と文字列との一致を調べたい

    PHPについては素人同然で このような質問を失礼します。 $hensu に入っている文字と $myword の文字(配列)とを比較して、 一致、不一致の処理を行いたいと考えています。 $myword にはNGのワードを複数入れたいので $myword = explode(",", "ああ,いい,うう"); という処理をするつもりです。 NGワードですので今後も増える可能性が ありますので。 このような形で処理する方法をお教えください。 何卒よろしくお願いします。

    • ベストアンサー
    • PHP
  • 変数の中に変数を

    お世話になっております。 質問タイトルにありますように、変数の記述のあるテキストを変数の中にいれたいのですが、元の変数が有効にならないため質問させていただきます。(グーグルで検索しているのですが、どれも解決に至らないので・・) データベースに変数($text)を含んだテキストを保存した後、以下のような構成のファイルをブラウザでみると、変数($text)は展開されずに、ブラウザ上に$textと表示されてしまいます。 <?php $text="テスト"; //DB問合わせ //上記、変数textを含んだテキストをDBから呼び出す echo $data;//この変数の中に、上記変数($text)が入っている。 ?> 以上のような場合、変数($text)を展開させるには、どのようにしたら宜しいのでしょうか? お忙しい中恐縮ですがアドバイスのほど宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • ○桁にある数値を取得する VB.NET2008

    お世話になります。 配列sampleにある3桁目の数値(下記の場合では、4)を取得したいのですが、 どうすればよいでしょうかご教授願います。 sample(0) = 23456

  • エクセル関数の書き方、入力方法

    エクセル関数の初心者です。関数の書き方で下記の内容について教えて下さい。 例えば、1行のセルA1~P16の表に入力された数値(1~3桁)で、少ない数値を5個を自動的に抽出し、その平均値を出す関数の書き方が分かりません。 但し、表中に同じ少ない数値が複数有る場合、その複数を含め5個抽出する式としたいのですが、どのような関数とすればよいでしょうか。