以下に簡単な例を示します。
sc = StringScanner.new( string ) while sc.rest? do sc.skip /\A\s+/ if tmp = sc.scan( /\A\w+/ ) then puts tmp end endこのコードは、文字列から単語を切りだし、それを表示します。
StringScanner の重要なメソッドは 3 つです。
scan は最も重要なメソッドで、与えられた正規表現がマッチする部分を切り出して
返します。skip はマッチした部分の先にポインタを進めるだけで、真偽値を返します。
empty? はポインタが最後までいったかどうかを真偽値で返すメソッドです。
rest? はその反対です。
scan を使った場合、どんな正規表現でも文字列の先頭にのみ
マッチします。たとえば、/string/ の場合、先頭に 'string' という
文字列がある場合のみマッチします。これは、内部で使う関数が Ruby の
デフォルトと違うからです。通常の Ruby の正規表現のような挙動をさせるには、
scan_until などの until 系メソッドを使います。
また、until 系メソッドでも、文字列の途中を(メソッドの返り値で)とりだすことは できません。例えば次のような場合は
s = StringScanner.new( "word word" ) ret = s.scan( /\s+/ )何事もなかったかのように ret には "word " が返り、ポインタはその先の w に セットされます。二個目の word が欲しいときは、正規表現の値格納かっこを 使ってください。
バージョン 0.6 以降では対象の文字列を途中で変化させることができます。 たとえば concat とか gsub! で加工できますし、あげくのはてには文字列自体 変えてしまうことができます。
sc = StringScanner.new( string ) sc.string << 'added' sc.string.gsub!( /\s+/, '' ) sc.string = another_string
Copyright (c) 1999,2000 Minero Aoki <aamine@dp.u-netsurf.ne.jp>