In message <20000618001312.A255046CD7 / hoyogw.netlab.co.jp>
wakou / fsinet.or.jp writes:

>     def Tabs::expand(string, tab_stop = 8)
>       cursor = 0
>       string.gsub(/([^\t]*)(\t+)/) do
>         cursor += Regexp::last_match[1].length
>         add_space = Regexp::last_match[2].length * tab_stop
>         add_space -= (cursor + add_space) % tab_stop
>         cursor += add_space
>         Regexp::last_match[1] + " " * add_space
>       end
>     end

前に ruby-list でみたのをいじって,

  def expand!(tw = 8)
    true while sub!(/(^|\n)([^\t\n]*)\t/) { $1+$2+" "*(tw-$2.size%tw) }
  end

なんてのを多用してましたが,これは等価でしょうかね? どっちが効率いいの
かわからないけど.


全然関係ないけど euc-jp 限定,「半角かな」未対応,ascii の単語は切らな
い fold とか.

# これも ruby-list でみたのの変形.本質は三行目ね.

  def fold!(w = 70)
    gsub!(/([\xa1-\xfe]{2})([0-9a-zA-Z])/no, "\\1 \\2")
    gsub!(/([0-9a-zA-Z])([\xa1-\xfe]{2})/no, "\\1 \\2")
    gsub!(/.{1,#{w}}(?:\s|\Z|(?=[\xa1-\xfe]{2}+(?:[ -~\s]|\Z)))/no) { $&+"\n" }
    self
  end

だれかこれに正規表現の追加だけで禁則処理を実装してくれる人募集とか :-)

# ぶら下げだけは簡単なんだけど.そのせいで実際には長々と書くはめになっ
# てる.まあ以前のものに比べるとずいぶん単純にできたけど.


どっちもオリジナルはわたなべさん作だったと.

# ちょっとすぐには思い付かないもんなぁ.


-- 
柳川和久 @ 東大阪市 . 大阪府                                  June 18, 2000
A man is known by the company he keeps.