ひだかです。

At 2002/01/29 13:10:28 Tatsuaki Nagai wrote:
> 永井@KCです。
> 
> さて、話を戻してしまうのですが、やはり、文字列をかたまりとして見た否定は
> できない話なのでしょうか。
> [^(\/\*.*\*\/)]で/や*がばらばらに否定文字クラスとならないような方法
> はないのでしょうか。

 [ruby-list:32221] の発展形ですよね。

 永井さんのおっしゃるような「否定」というのは定義があいまいなのだと
おもいます。

 [^(\/\*.*\*\/)] を字義どおりに否定として解釈すると、もちろん "abc" とか 
"/ab" とかにもマッチしますが、スペース1個などにもマッチしてしまいます。

 たぶんやりたいことというのは、

 文字列のなかで特定の正規表現(ここでいえば%r|/\*.*\*/|)にマッチしない
部分だけを対象とした正規表現マッチ

ということになるかとおもうのです。そういうライブラリを書くのが
いいかもしれません。

class String
  def without_match(re)
    re = Regexp.new('(' + re.source + ')')
    split(re).map { |s|
      if re =~ s 
	s 
      else 
	yield s 
      end
    }.join
  end
end

puts "a b /* a b c */ def".without_match(/\/\*.*\*\//) { | s | s.gsub(/(\S+)/, '"\1"') }

こんなの作ってみましたがどうでしょうね。

-- 
ひだかたかひろ