あおきです。
文字列に対するスキャンを行うための拡張モジュールを書きました。
次のような感じでつかいます。
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/