【ruby】subの使い方 - 文字列から最初の/~/までを切り取る方法

このQ&Aのポイント
  • 文字列から特定のパターンにマッチする部分を置換する際に使われるRubyのsubメソッドについて質問します。具体的には、文字列から最初の/~/までを切り取る方法を知りたいです。
  • subメソッドを使って/~/にマッチする部分を置換しようとしましたが、期待した結果が得られませんでした。正規表現のパターンは正しいと思いますが、何が間違っているのかわかりません。ご教示いただけますか?
  • 正規表現のパターンには、/~/にマッチするようなものを指定しましたが、subメソッドの結果が期待通りになりません。同じ正規表現を使って=~演算子を使うと正しい結果が得られますが、subメソッドではなぜうまくいかないのか理解できません。アドバイスをいただけますか?
回答を見る
  • ベストアンサー

【ruby】subの使い方

文字列から最初の/~/までを切り取りたいです。 たとえば、"/aaa/bbb/ccc"の場合、"/aaa/"です。 そこで、subを使って以下の様に書いてみました。 puts "/aaa/bbb/ccc".sub(/(\/.*?\/)/,'\1') しかし、/aaa/bbb/cccと表示され、期待した結果が得られません。 以下の様にすると、 /(\/.*?\/)/=~"/aaa/bbb/ccc" puts $1 期待通り/aaa/が表示されるのですが、正規表現はsubのときと同じだし、 subの使い方の何が悪いのかわからなくなってしまいました。 ご指導のほど、宜しくお願いいたします。

  • Ruby
  • 回答数1
  • ありがとう数2

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

  • ベストアンサー
回答No.1

関数自体の機能を誤解している。 やりたいのは 「元の文字列のうち,第一引数で与えられた正規表現にマッチした部分を第二引数で置き換えた」subメソッドではなく http://www.ruby-doc.org/core/classes/String.html#M000816 「元の文字列のうち,第一引数で与えられた正規表現にマッチした部分だけを取得する」matchメソッドではないだろうか? http://www.ruby-doc.org/core/classes/String.html#M000778

kingfruits
質問者

お礼

himajin100000さん。ご回答ありがとうございました。 ご指摘の通り、誤解しておりました。 p.s 自己紹介欄、拝見させていただきました。(汗 >正規表現を使って要素を取り出すタイプの質問。 >……もう嫌だ,見たくない。

関連するQ&A

  • 正規表現でシングルクォーテーションで囲まれた文字列

    VB.NET で開発を行っています。 シングルクォーテーションで囲まれた文字列の検索を行いたいのですが正規表現の記述が良くわからないので困っています。 たとえば 'AAA' + 'BBB' + 'CCC' 上記のの文字列から「'AAA'」「'BBB'」「'CCC'」も検索したいのですが,パターンとして「'.*'」を用いると「'AAA' + 'BBB' + 'CCC'」が返ってきます。 どなたかご教授ください。よろしくお願いします。

  • sedで「(~)」を使って文字列の一部を取り出し

    sedで「(~)」を使って、文字列の一部を取り出したいのですが期待した結果になりません。 以下のようなファイルがあります。 そこから、最初に見つかった「A-Z0-9」を含む文字列を取り出したいのですが、 どうしても、2番目にでてくる「0-9」でなる文字列が取り出されます。 環境は、Solaris/Linuxになります。 ■ファイル cat aaa "aaa","bbb","ccc","123456","ddd","eee","fff,"0000","ggg" "aaa","bbb","ccc","AAA123","ddd","eee","fff,"0000","ggg" ■sed sed 's/.*,"\([A-Z0-9].*[0-9]\)",.*$/\1/g' aaa ■結果 0000 0000 期待する結果は、 123456 AAA123 なのですが、 期待した結果を取り出すにはどうしたらよいのでしょうか。

  • 2回以上繰り返される文字列の削除について

    以下の文字列(置換前)で、-aaa について複数存在しているので、 最初の -aaa を残して残りの -aaa をすべて削除したいと考えています。 1回の正規表現+置換で行いたいのですが、どのようにいすればよいでしょうか? 【置換前】 -bbb -aaa -ccc -aaa -ddd -eee -aaa -fff 【置換後】 -bbb -aaa -ccc -ddd -eee -fff ちなみに、複数回の正規表現+置換を使ってよい場合は、 while (m/( -aaa.*) -aaa/) { s/( -aaa.*) -aaa/$1/; } でできると考えています。(動作確認まではしていないので間違ってるかも)

    • ベストアンサー
    • Perl
  • Perlの正規表現について

    Perlの正規表現について質問です. ■質問 aaa bbb aaa bbb ccc "ddd" aaa bbb ccc "ddd eee" aaa bbb ccc ddd eee "fff ggg hhh iii" というような,文字列が書かれているファイルがあるとします. ※ダブルクォーテーションが無い行もあります. ※ダブルクォーテーション内のスペースの数は,行によってそれぞれ異なります. これを,ダブルクォーテーションの中にあるスペースだけ アンダーバーに置換する場合の正規表現を教えて下さい. つまり,下記の出力にしたいです. aaa bbb aaa bbb ccc "ddd" aaa bbb ccc "ddd_eee" aaa bbb ccc ddd eee "fff_ggg_hhh_iii" ■条件 ※ちょっと古いPerlでも動くよう,ゼロ幅肯定/否定後読((?<),(!<))は使わないでください. ※単に実現するだけなら, # cat inputfile | print -pe 'sub f(){}(shift;s/ /_/;return $_;); s/(\".*\")/&f($1)/e;' みたいな感じで置換できそうですが,「正規表現だけで簡単に書けるかどうか」が知りたいのです(正規表現だけで実現出来る場合,そのアルゴリズムを知りたいです).そのため,関数と/eオプションは使わないでください.

    • ベストアンサー
    • Perl
  • ruby 正規表現について教えてください。お願いします。

    スイマセン初心者で、正規表現についてほかのみなさんにとっては、簡単なんだと思いますけど、どうかご回答お願いします。 テキストファイルを読み込んで、ある文字列の、ある場所だけを、出したいです。 テキストは #AAA#(aab acb dde) #BBB#(001) #AAA#(bca kme lmg) #BBB#(002) #AAA#の()の中身は適当な文字列で、他の文字が入ると考えての場合です。 この場合で、 #AAA#の文字列の、#AAA#と()を除いた文字列つまりこの場合だと、 aab acb dde bca kme lmg を出したいんです。 簡単な問題なんだと思いますけど、どうか回答お願いします。

  • 正規表現について

    正規表現を使用して文字列の置換(ereg_replace)をしたいと思うのですが、 うまくいかず悩んでおります。。 以下の文字列があったとします。 【AAA】【BBB】【CCC】DDD 文字列の中から先頭から始まる【】でくくられたものだけ(【AAA】)だけ削除して、 結果を【BBB】【CCC】DDDとしたいのですが、正規表現でどのようにヒットさせればよいのか分りません。 ※【】の中にくる文字はAAAとは限りません。 お手数ですがご教授頂けますでしょうか。

    • ベストアンサー
    • PHP
  • ''で囲まれていない文字列にマッチする正規表現

    下記のような文字列($str)に対して置換を行い、 my $str = qq{ AAA = BBB - 'CCC' }; $str =~ s/★正規表現★/sprintf("DDD(%s)",$1)/xmsge ; 変換後 $str = DDD(AAA) = DDD(BBB) - 'CCC' ; を実現する★正規表現★を書きたいと思っています。  ・AAA,BBB,CCCは[\w]で構成される文字列です。 ですが、シングルクォーテーション('')で囲まれていない文字列にマッチする正規表現が書けなく困っています。 一度、シングルクォーテーションで囲まれているものも含めて全てDDD()をつけて、そのあとで、シングルクォーテーションを含むものは元に戻すことでやりたいことは実現できているのですが、1行で実現できる方法を探しています。 アドバイスよろしくお願いします。

    • ベストアンサー
    • Perl
  • rubyの文法について質問です。

    rubyの文法について質問です。 aaa = `diff -q bbb ccc` のような形でdiffコマンドの実行結果をaaaに格納したいのですが bbb及びcccを任意に入力したく、一度getsメソッドでbbb,cccそれぞれに文字列を代入したのですが、それをバッククォーテーション内で使用できず困っています。 なにか解決策がありましたらご教授いただけるとありがたいです。 よろしくお願いします。

    • ベストアンサー
    • Ruby
  • 正規表現

    正規表現 a=/home/aaa/bbb/ccc/ddd.abc echo ${a%.abc}実行したら /home/aaa/bbb/ccc/ddd が表示されますが、 home/aaa/bbb/ccc/ddd に表示したいですがうまくいきません。 ネットで正規表現さがしてみたけど理解できませんでした。 教えていただきたいです。なお 説明文も簡単に記入していただいたら幸いです。

  • エクセルの文字処理

    以前に同じ様な質問があったかも知れませんが、探しきれなかったので教えてください。 A1~A4の4つのセルに以下のスペースが入った文字列が入っていた場合 A1|AAA A2|AAA BBB A3|AAA BBB CCC A4|AAA BBB CCC DDD    A   B   C   D  1|    AAA 2|AAA BBB 3|AAA BBB CCC 4|AAA BBB CCC DDD という具合にしたいのです。 条件は  ・セル内にスペースで区切られない文字列があった場合には、B列に入れる  ・それ以外はスペースで区切って、A列B列C列D列に入れる  ・文字数は3文字固定ではなく全角半角が混在 以上です。すいません宜しく願いします。

専門家に質問してみよう