あおきです。

文字列に対するスキャンを行うための拡張モジュールを書きました。
次のような感じでつかいます。

require 'strscan'

LWSP = /\A[ \t]+/o
WORD = /\A\w+/o

s = StrScanner.new( "a a a a a" )

                # 返り値   残りの文字列
s.scan( LWSP )  # nil      "a a a a a"
s.scan( WORD )  # 'a'      " a a a a"
s.skip( LWSP )  # 1        "a a a a"
s.scan( WORD )  # 'a'      " a a a"
s.scan( LWSP )  # ' '      "a a a"
s.scan( /\ / )  # 'a '     "a a"


このモジュールでは C レベルでポインタを操作して、文字列を再生成
することなくスキャンできるようにしているので、

while str.size > 0 do
  if WORD === str then
    str = $'
     :

なんてコードと比べると速度が大幅に向上します。

ただしこのモジュールではRegexpクラスの外側でマッチを行っているので、
普通の正規表現マッチと違って
  1  $KCODEの変化に追従できない
  2  $1 $' などをいっさいセットしない
などの不具合があります。


パッケージはとりあえずぼくのサイト
  http://www1.u-netsurf.ne.jp/~brew/mine/soft/strscan-0.1.0.tar.gz
あたりからどうぞ。メソッドの詳細などは doc.jp/ 以下のHTMLを
参照してください。



まつもとさんへ

in.coming にパッケージを置きましたので、移動をお願いいたします。
ファイル名は strscan-0.1.0.tar.gz です。

# 置くとき間違って一度contribでputしてしまいました。
# もうしわけありません。
-------------------------------------------------------------------
あおきみねろう  mail: aamine / dp.u-netsurf.ne.jp
                site: http://www1.u-netsurf.ne.jp/~brew/mine/