人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Ruby1.9.3について質問です。
Stringのdeleteメソッドの動作規則が分かりません。

"hello".delete("l", "lo")とした場合、「heo」となります。
"hello".delete("l", "o")とした場合、「hello」となります。

私が動かして確認してみた結果、引数で指定された文字列中の重複する文字だけが削除されるという認識になりました。

これは正しいでしょうか?
また、何のため第二引数以降を指定するのでしょうか?
第一引数に削除したい文字をすべて指定すればいいのではと思います。

●質問者: Gaasu
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● a-kuma3
●50ポイント ベストアンサー

私が動かして確認してみた結果、引数で指定された文字列中の重複する文字だけが削除されるという認識になりました。

これは正しいでしょうか?

ある意味、正しいです。

ruby のドキュメントからの引用です。
http://doc.ruby-lang.org/ja/1.9.3/class/String.html

なお、引数を複数指定した場合は、すべての引数にマッチする文字だけが削除されます。

「ある意味」と書いたのは、"^" の表現があるからです。

また、何のため第二引数以降を指定するのでしょうか?

引数がひとつだけだと、表現できないケースがあります。

"^0-9" のように文字列の先頭が `^' の場合は指定文字以外を意味します。

delete の引数を定数で指定できない場合(プログラムの結果で導き出される)で、且つ、ひとつは "^" を指定したくなる場合。
例えば、5よりも大きくて、素数では無い数字を削除したい場合、素直に表現すると以下のようになります。
str.delete("5-9", "^2357")
ふたつの条件から、"5689" という文字列を作って、
str.delete("5689")
としても同じことですが、その文字列を作る手間を delete に任せることができます。


2 ● うぃんど
●25ポイント

引数が複数ある場合はいずれにもマッチする文字が削除対象となりますので、
"hello".delete("l", "lo") であれば、
どちらにも含まれている"l"が削除対象となり結果は"heo"となりますが、
"hello".delete("l", "o") には、同じ文字が含まれていないため、
削除対象となる文字が無く結果は"hello"のままとなるわけです


3 ● satoxu
●25ポイント

一部正しいのですが、少しだけ勘違いがあります。

str.delete の第一引数に"lo"を指定した場合には、l もしくは o と解釈されます。

引数を複数指定した場合、各引数は∩(かつ)の関係で解釈されます。

つまり、

"hello".delete("lo") -> l か o を削除 -> he

"hello".delete("l", "lo") -> l かつ l か o -> heo(lかつlのみ削除)

"hello".delete("l", "o") -> l かつ o -> hello(該当なし)

となります。

もしも特定の文字列(lo、lloなど)を削除した場合には、delete ではなく、subか
gsubを使用された方がよいかと思います。

$test = "hello".sub("lo", "") -> hel(loを何もなしに置換)

$test = "hello".sub("l", "") -> helo(最初のlのみ何もなしに置換)
$test = "hello".gsub("l", "") -> heo(すべてのlを何もなしに置換)

sub と gsub の違いは「最初にマッチしたものだけ置換するか、すべてを置換するか」です。

関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ