それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

ruby 文字列(配列)を指定数で分割する

文字列を指定数で分割するには?

  • 文字列を配列と考える。
  • 文字列を正規表現でマッチする。

の2パターンがアプローチできる。

文字列を配列と考える場合

"914119904bf39f27a487d9240d3aab9b68732fc7".chars.each_slice(2).map(&:join).join(":")
#=>"91:41:19:90:4b:f3:9f:27:a4:87:d9:24:0d:3a:ab:9b:68:73:2f:c7"

文字列を正規表現でマッチする。

"914119904bf39f27a487d9240d3aab9b68732fc7".scan(/.{1,2}/).join(":")
#=>"91:41:19:90:4b:f3:9f:27:a4:87:d9:24:0d:3a:ab:9b:68:73:2f:c7"

HEXをソースコードに落とし込む。

たとえば、次のようなMDSUMの値があったとき。

d5a1921a053d5b56c46478a13569c751

これを、次のようにHEX表記に変えてやると

a= 'd5a1921a053d5b56c46478a13569c751'
a.chars.each_slice(2).map(&:join).map{|e| "0x"+e }.join(", ")
## => "0xd5, 0xa1, 0x92, 0x1a, 0x05, 0x3d, 0x5b, 0x56, 0xc4, 0x64, 0x78, 0xa1, 0x35, 0x69, 0xc7, 0x51"

0xを付記するだけで、ずいぶんと印象が変わるし、バイナリなんだな。と実感できる。

オススメは、正規表現

正規表現でscanを覚えたほうがいいね。

言語に非依存正規表現に依存するので、ruby に限らない知識として有用だと思う。

#each_cons だの指定個数に区切るだの、配列をRangeで区切るとか色々、すごく解答例があると思うんだけど、正規表現が汎用性があると思うんだ。

150010 => 15:00:11 

とか時刻表記にも応用できるね!

ある目的のために、いろいろな回答が考えられるからプログラムって面白いんだと思う。