ruby の質問です。#3 は、3になってしまうのですが、これは、Ruby の仕様なのでしょうか? 避けるにはどうしたらいいのでしょう。

カンマの数はどちらも同じなのです。
t = "1,2,3,," #3
#t = "1,2,3,x," #4
puts t.split(/,/).size

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:2009/08/03 22:00:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答4件)

id:JULY No.1

回答回数966ベストアンサー獲得回数247

ポイント23pt

String - Rubyリファレンスマニュアル

t.split(/,/, -1).size

で 5 となります。これがお望みの結果かな?

id:longicorn No.2

回答回数56ベストアンサー獲得回数6

ポイント23pt

質問からは結果をどうしたいか? が書いていないので想像で回答します。


両方共同じ数で分割したいのであればこれでどうでしょうか?

irb(main):016:0> "1,2,3,,".scan(/.?,/).map{|v|v.delete(",")}
=> ["1", "2", "3", ""]
irb(main):017:0> "1,2,3,4,".scan(/.?,/).map{|v|v.delete(",")}
=> ["1", "2", "3", "4"]

ダミー

http://www.hatena.ne.jp/

id:kaiketsu

こんなめんどうなことをしないといけないのでしょうか?

2009/07/28 00:05:55
id:Cherenkov No.3

回答回数1504ベストアンサー獲得回数493

ポイント22pt

t=["a","b","c",""]

puts t.size #4

http://q.hatena.ne.jp/answer

id:kaiketsu

単純に、split したときに、空があったら、空の値を持つ配列をつくって欲しいだけなんですが。。。。

2009/07/28 00:06:47
id:garyo No.4

回答回数1782ベストアンサー獲得回数96

ポイント22pt

>単純に、split したときに、空があったら、空の値を持つ配列をつくって欲しいだけなんですが。。。。

1番の回答者JULYさんの回答が正しいと思いますよ。

split([sep[, limit]])

(中略)

limit は以下のいずれかです。


* 省略 or 0: 配列末尾の空文字列は取り除かれる。

* limit > 0: 最大 limit 個のフィールドに分割する。

* limit < 0: 無限に大きい limit が指定されたかのように分割する。


例: limit の例


# limit 省略時は、0 を指定したのと同じ。配列末尾の空文字列は取り除かれる

p "a,b,c,,,".split(/,/) # => ["a", "b", "c"]

p "a,b,c,,,".split(/,/, 0) # => ["a", "b", "c"]


# limit が 最大のフィールド数に満たない場合は最後の要素に残りすべてが入る

p "a,b,c,,,".split(/,/, 3) # => ["a", "b", "c,,,"]


# limit が -1 や最大のフィールド数以上の場合は最大のフィールド数を指定したのと同じ

p "a,b,c,,,".split(/,/, 6) # => ["a", "b", "c", "", "", ""]

p "a,b,c,,,".split(/,/, -1) # => ["a", "b", "c", "", "", ""]

p "a,b,c,,,".split(/,/, 100) # => ["a", "b", "c", "", "", ""]

http://www.ruby-lang.org/ja/man/html/String.html

id:kaiketsu

なるほど、そういった仕様なんですね。

2009/07/28 11:09:01
  • id:JULY
    longicon さんの回答にもあるように、どういう結果を期待しているのかが、微妙に分かりません。

    kaiketsu さんが logicon さんの回答に「こんなめんどうなこと...」と書かれていることから、split した後の配列数を4個であることを期待するのであれば、そもそも、t に設定している文字列が、「4つのカンマに区切られた5つの要素」と考える方が一般的だと思います。

    perl でも同じ結果になります。

    -----------------------------------------------------------------------------------
    my $t = "1,2,3,,";

    my $num_without_limit = split(/,/, $t);
    my $num_with_minus_limit = split(/,/, $t, -1);

    print "without_limit: $num_without_limit\nwith_minus_limit: $num_with_minus_limit\n";
    --------------------------------------------------------------------------------------

    結果:
    -------------------
    without_limit: 3
    with_minus_limit: 5
    -------------------

    もし、配列の数が4個を期待するなら、「カンマ区切り」ではなく「カンマを終端とする要素に分割」なので、split は使えませんので、longicon さんのような記述になります。

    あと、ちょっと意味が違ってしまいますが、「文字列の終端に必ずカンマがあると仮定する」と、下記のような書き方も出来ます。

    ---------------------------------
    p t.gsub(/,$/, '').split(/,/, -1)
    ----------------------------------

    結果:
    ----------------------
    ["1", "2", "3", ""]
    ----------------------

    もし、最後のカンマと文字列の終端までの間に空白文字を許し、その空白文字を無視するのであれば、

    -------------------------------------
    p t.gsub(/,\s*$/, '').split(/,/, -1)
    -------------------------------------

    となります。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません