Ruby 2.1.0 リファレンスマニュアル > ライブラリ一覧 > scanfライブラリ > Stringクラス > scanf

instance method String#scanf

scanf(format) -> Array[permalink][rdoc] [added by scanf]
scanf(format) {|*ary| ...} -> Array [added by scanf]

ブロックを指定しない場合、見つかった文字列を format に従って変 換し、そのオブジェクトの配列を返します。 format で指定した文字列が見つからない場合は空の配列を 生成して返します。

str = "123 abc 456 def 789 ghi"
p str.scanf("%d%s") #=> [123, "abc"]

ブロックを指定した場合は scanf を継続して実行し、順次 見つかった文字列を変換したオブジェクトの配列を引数に、ブロックを 実行します。このとき、ブロックの実行結果を要素とする配列を返します。

str = "123 0x45 678 0x90"
p str.scanf("%d%x"){|n, s| [n, s]}
#=> [[123, 69], [678, 144]]

formatに完全にマッチしていなくても、部分的にマッチしていれば、 ブロックは実行されます。

str = "123 abc 456 def"
ret = str.scanf("%s%d") { |s, n| [s, n] }
p ret #=> [["123", nil], ["abc", 456], ["def", nil]]
[PARAM] format:
スキャンするフォーマットを文字列で指定します。 詳細は、String#scanf/scanfフォーマット文字列 を参照してください。

使用例:

str = "123 abc 456 def 789 ghi"
p str.scanf("%d%s") #=> [123, "abc"]

scanfフォーマット文字列

文字 '%' と(s,d のような)指示子の間に、整数を指定する事により読み込む文字列の幅を 指定する事ができます。もし幅が与えられなければ、無限大の値が規定値として使用されます。 (但し、%c では、この規定値は適用されません。) 上記の幅が整数 n で与えられた場合、多くても n 個の文字列がマッチします。 このフォーマット文字列によるマッチの実行前、多くの場合入力文字列のスペースは読み飛ばされます。 つまり、スペースは幅の数として数えられない事になります。

動作例;

p "a           10".scanf("%s %d")  # => ["a", 10]
p "a10".scanf("%1s %d")      # => ["a", 10]

使用例;

str = "1234"
p str.scanf("%1s%3d")  #=> ["1", 234]

また、1.9 以降では、スペースには全角文字列が含まれます。

動作例;

# encoding: utf-8
require 'scanf'

str = "1     aaa"
p str.scanf("%d %s") #=> [1, "aaa"]
space

フォーマット中の空白は(0個を含む)任意の数の空白にマッチします。

  p "a           10".scanf("%s %d")  # => ["a", 10]
  p "a10".scanf("%1s %d")            # => ["a", 10]
%%

% そのもの

%d
%u

符号付き10進数

%i

Kernel.#Integerのように接頭辞を受け付ける符号付き整数

%o

符号付き8進数

%x
%X

符号付き16進数

%e
%f
%g
%E
%F
%G
%a
%A

符号付き浮動小数点数

%s

空白文字を含まない文字列 (幅が指定されているときは指定された文字数か空白文字の直前までの短い方)

%c

1文字(幅が指定されているときは指定された文字数)

[...]

正規表現/文字クラス