Ruby 1.9.2 リファレンスマニュアル > ライブラリ一覧 > strscanライブラリ > StringScannerクラス
クラスの継承リスト: StringScanner < Object < Kernel < BasicObject
StringScanner は文字列スキャナクラスです。 簡単に高速なスキャナを記述できます。
s = StringScanner.new('This is an example string')
s.eos?            #=> false
p s.scan(/\w+/)   #=> "This"
p s.scan(/\w+/)   #=> nil
p s.scan(/\s+/)   #=> " "
p s.scan(/\s+/)   #=> nil
p s.scan(/\w+/)   #=> "is"
s.eos?            #=> false
p s.scan(/\s+/)   #=> " "
p s.scan(/\w+/)   #=> "an"
p s.scan(/\s+/)   #=> " "
p s.scan(/\w+/)   #=> "example"
p s.scan(/\s+/)   #=> " "
p s.scan(/\w+/)   #=> "string"
s.eos?            #=> true
p s.scan(/\s+/)   #=> nil
p s.scan(/\w+/)   #=> nil
StringScanner オブジェクトはスキャンする文字列と「スキャンポインタ」のセットです。 スキャンポインタとはスキャンしおわったところを示すインデックスのことです。 オブジェクト作成直後にはスキャンポインタは文字列先頭にあり、 その地点でのみマッチを試します。マッチしたらその後ろにポインタを進めます。
## a string and a scan pointer   ("_" = scan pointer)
s = StringScanner.new('This is an example string')
_This is an example string     s.eos? = false
s.scan(/\w+/)
This_ is an example string     s.eos? = false
s.scan(/\s+/)
This _is an example string     s.eos? = false
s.scan(/\w+/)
This is_ an example string     s.eos? = false
s.scan(/\s+/)
This is _an example string     s.eos? = false
s.scan(/\w+/)
This is an_ example string     s.eos? = false
s.scan(/\s+/)
This is an _example string     s.eos? = false
s.scan(/\w+/)
This is an example_ string     s.eos? = false
s.scan(/\s+/)
This is an example _string     s.eos? = false
s.scan(/\w+/)
This is an example string_     s.eos? = true
現在のスキャンポインタがさす地点以外でもマッチしたい場合は、StringScanner#scan_untilなど を使ってください。
例: scan, scan_full の動作の違い
def case1
  s = StringScanner.new('test string')
  p s.scan(/t/)       #=> "t"
  p s.scan(/\w+/)     #=> "est"
  p s.scan(/string/)  #=> nil
  p s.scan(/\s+/)     #=> " "
  p s.scan(/string/)  #=> "string"
end
def case2
  s = StringScanner.new('test string')
  p s.scan_until(/t/)       #=> "t"
  p s.scan_until(/\w+/)     #=> "est"
  p s.scan_until(/string/)  #=> " string"
  p s.scan_until(/\s+/)     #=> nil
  p s.scan_until(/string/)  #=> nil
end
p "case1"
case1
p "case2"
case2
スキャンポインタの位置は文字単位でなくバイト単位となります。
# vim:set fileencoding=euc-jp:
require 'strscan'
s = StringScanner.new("るびい") # 文字コードはEUC-JPとします
p s.exist?(/び/) #=> 4
StringScanner は $~ $& $1 $2 …… などの正規表現関連変数を セットしません。代わりに StringScanner#[], StringScanner#matched? などの マッチデータ関連メソッドを使ってください。
| 定義 | 説明 | |
|---|---|---|
  
  must_C_version -> self
  
 | 
このメソッドは後方互換性のために定義されています。  | 
|
  
  new(str, dup = false) -> StringScanner
  
 | 
新しい StringScanner オブジェクトを生成します。  | 
|
| 定義 | 説明 | |
|---|---|---|
  
  self << str -> self
 | 
操作対象の文字列に対し str を破壊的に連結します。 マッチ記録は変更されません。  | 
|
  
  self[nth] -> String | nil
  
 | 
前回マッチした正規表現の nth 番目のかっこに対応する部分文字列を 返します。インデックス 0 はマッチした部分全体です。前回のマッチが 失敗していると常に nil を返します。  | 
|
  
  beginning_of_line? -> bool
 | 
スキャンポインタが行頭を指しているなら true を、 行頭以外を指しているなら false を返します。  | 
|
  
  check(regexp) -> String | nil
  
 | 
現在位置から regexp とのマッチを試みます。 マッチに成功したらマッチした部分文字列を返します。 マッチに失敗したら nil を返します。  | 
|
  
  check_until(regexp) -> String | nil
  
 | 
regexp が一致するまで文字列をスキャンします。 マッチに成功したらスキャン開始位置からマッチ部分の末尾までの部分文字列を返します。 マッチに失敗したら nil を返します。  | 
|
  
  terminate -> self
 | 
スキャンポインタを文字列末尾後まで進め、マッチ記録を捨てます。  | 
|
  
  eos? -> bool
 | 
スキャンポインタが文字列の末尾を指しているなら true を、 末尾以外を指しているなら false を返します。  | 
|
  
  exist?(regexp) -> Fixnum | nil
  
 | 
スキャンポインタの位置から,次にマッチする文字列の末尾までの長さを返します。  | 
|
  
  get_byte -> String | nil
 | 
1 バイトスキャンして文字列で返します。 スキャンポインタをその後ろに進めます。 スキャンポインタが文字列の末尾を指すなら nil を返します。  | 
|
  
  getch -> String | nil
  
 | 
一文字スキャンして文字列で返します。 スキャンポインタをその後ろに進めます。 スキャンポインタが文字列の末尾を指すならnilを返します。  | 
|
  
  inspect -> String
  
 | 
StringScannerオブジェクトを表す文字列を返します。  | 
|
  
  match?(regexp) -> Fixnum | nil
  
 | 
スキャンポインタの地点だけで regexp と文字列のマッチを試します。 マッチしたら、スキャンポインタは進めずにマッチした 部分文字列の長さを返します。マッチしなかったら nil を 返します。  | 
|
  
  matched -> String | nil
  
 | 
前回マッチした部分文字列を返します。 前回のマッチに失敗していると nil を返します。  | 
|
  
  matched? -> bool
  
 | 
前回のマッチが成功していたら true を、 失敗していたら false を返します。  | 
|
  
  matched_size -> Fixnum | nil
  
 | 
前回マッチした部分文字列の長さを返します。 前回マッチに失敗していたら nil を返します。  | 
|
  
  matchedsize -> Fixnum | nil
  
 | 
StringScanner#matched_size と同じです。  | 
|
  
  peek(bytes) -> String
 | 
スキャンポインタから長さ bytes バイト分だけ文字列を返します。  | 
|
  
  pointer -> Fixnum
 | 
現在のスキャンポインタのインデックスを返します。  | 
|
  
  pointer=(n)
 | 
スキャンポインタのインデックスを n にセットします。  | 
|
  
  post_match -> String | nil
  
 | 
前回マッチを行った文字列のうち、マッチしたところよりも後ろの 部分文字列を返します。前回のマッチが失敗していると常に nil を 返します。  | 
|
  
  pre_match -> String | nil
  
 | 
前回マッチを行った文字列のうち、マッチしたところよりも前の 部分文字列を返します。前回のマッチが失敗していると常に nil を 返します。  | 
|
  
  reset -> self
  
 | 
スキャンポインタを文字列の先頭 (インデックス 0) に戻し、 マッチ記録を捨てます。  | 
|
  
  rest -> String
  
 | 
文字列の残り (rest) を返します。 具体的には、スキャンポインタが指す位置からの文字列を返します。  | 
|
  
  rest? -> bool
  
 | 
文字列が残っているならば trueを、 残っていないならば false を返します。  | 
|
  
  rest_size -> Fixnum
 | 
文字列の残りの長さを返します。 stringscanner.rest.size と同じです。  | 
|
  
  scan(regexp) -> String | nil
  
 | 
スキャンポインタの地点だけで regexp と文字列のマッチを試します。 マッチしたら、スキャンポインタを進めて正規表現にマッチした 部分文字列を返します。マッチしなかったら nil を返します。  | 
|
  
  scan_full(regexp, s, f) -> object
  
 | 
スキャンポインタの位置から regexp と文字列のマッチを試します。 マッチに成功すると、s と f の値によって以下のように動作します。  | 
|
  
  scan_until(regexp) -> String | nil
  
 | 
regexp で指定された正規表現とマッチするまで文字列をスキャンします。 マッチに成功したらスキャンポインタを進めて、 スキャン開始位置からマッチ部分の末尾までの部分文字列を返します。 マッチに失敗したら nil を返します。  | 
|
  
  search_full(regexp, s, f) -> object
  
 | 
regexp で指定された正規表現とマッチするまで文字列をスキャンします。 マッチに成功すると、s と f の値によって以下のように動作します。  | 
|
  
  skip(regexp) -> Fixnum | nil
  
 | 
スキャンポインタの地点だけで regexp と文字列のマッチを試します。 マッチしたらスキャンポインタを進めマッチした部分文字列の 長さを返します。マッチしなかったら nil を返します。  | 
|
  
  skip_until(regexp) -> Fixnum | nil
  
 | 
regexp が一致するまで文字列をスキャンします。 マッチに成功したらスキャンポインタを進めて、 スキャン開始位置からマッチ部分の末尾までの部分文字列の長さを返します。 マッチに失敗したら nil を返します。  | 
|
  
  string -> String
  
 | 
スキャン対象にしている文字列を返します。  | 
|
  
  string=(str)
  
 | 
スキャン対象の文字列を str に変更して、マッチ記録を捨てます。  | 
|
  
  unscan -> self
  
 | 
スキャンポインタを前回のマッチの前の位置に戻します。  | 
|
| 定義 | 説明 | |
|---|---|---|
  
  Id -> String
  
 | 
StringScanner クラスの詳しいバージョンを文字列で返します。 この文字列は Object#freeze されています。  | 
|
  
  Version -> String
  
 | 
StringScanner クラスのバージョンを文字列で返します。 この文字列は Object#freeze されています。  | 
|
!
!=
==
===
=~
__id__
__send__
_dump
class
clone
dclone
display
enum_for
eql?
equal?
extend
freeze
frozen?
hash
initialize
initialize_copy
instance_eval
instance_exec
instance_of?
instance_variable_defined?
instance_variable_get
instance_variable_set
instance_variables
is_a?
marshal_dump
marshal_load
method
method_missing
methods
must_be
must_be_close_to
must_be_empty
must_be_instance_of
must_be_kind_of
must_be_nil
must_be_same_as
must_be_within_epsilon
must_equal
must_include
must_match
must_raise
must_respond_to
must_send
must_throw
nil?
pretty_inspect
pretty_print
pretty_print_cycle
pretty_print_inspect
pretty_print_instance_variables
private_methods
protected_methods
public_methods
remove_instance_variable
respond_to?
respond_to_missing?
singleton_class
singleton_method_added
singleton_method_removed
singleton_method_undefined
singleton_methods
taint
tainted?
tap
to_a
to_ary
to_hash
to_int
to_io
to_proc
to_regexp
to_s
to_str
to_yaml
to_yaml_properties
to_yaml_style
trust
untaint
untrust
untrusted?
wont_be
wont_be_close_to
wont_be_empty
wont_be_instance_of
wont_be_kind_of
wont_be_nil
wont_be_same_as
wont_be_within_epsilon
wont_equal
wont_include
wont_match
wont_respond_to