まくまくRubyノート
文字列をデリミタで分割する
2011-10-01

String#split は指定したデリミタ文字列(正規表現による区切り文字列の指定も可能)で文字列を分割し、その結果を配列で返します。

デリミタを省略した場合(連続するスペースで区切る)

デリミタを省略すると、文字列の先頭と末尾のスペースを取り除いた上で、連続した空白文字で分割してくれます。

'A B C'.split        #=> ["A", "B", "C"]
'A B  C  '.split     #=> ["A", "B", "C"]
"A\t B \tC\t".split  #=> ["A", "B", "C"]

デリミタとして nil' '(1 文字の半角スペース)を指定した場合も、省略時と同様に振る舞います。

'A B  C  '.split(nil)   #=> ["A", "B", "C"]

デリミタを指定した場合

下記は、連続するスペースの代わりにカンマで区切る例です。 文字列の末尾に連続して現れるデリミタは無視されます。

'A,B,C'.split(',')      #=> ["A", "B", "C"]
'A, B, C'.split(',')    #=> ["A", " B", " C"]
'A,,B,C'.split(',')     #=> ["A", "", "B", "C"]
',,A,B,C'.split(',')    #=> ["", "", "A", "B", "C"]
'A,B,C,,,'.split(',')   #=> ["A", "B", "C"]  ★末尾の連続するセパレータは無視される
'A,B,C, , '.split(',')  #=> ["A", "B", "C", " ", " "]  ★セパレータ間にスペースがあれば無視されない

下記のようにすれば、文字列の先頭と末尾、各セパレータの前後のスペースを取り除きつつ分割することができます。

' A, B,  C  '.strip.split(/\s*,\s*/)  #=> ["A", "B", "C"]

おまけ: 1 文字ずつの分割

デリミタとして空文字 '' を指定すると、1 文字ずつに分割されます。 ただ、String クラスには、文字列を一文字ずつに分割する chars メソッドが用意されていますので、そちらを使った方が意図が伝わりやすいかもしれません。

'ABC'.split('')  #=> ["A", "B", "C"]
'ABC'.chars      #=> ["A", "B", "C"]
2011-10-01