From: Shin-ichiro HARA Date: 1997-12-11T19:09:12+09:00 Subject: [ruby-dev:1049] Re: Regexp#operators (Re: ruby 1.1b1 released) 原です。 ちょっと紛らわしい事を書いてしまったので訂正します。 > 原です。 > 積(&)は共通部分です。例えば /^[a-d]$/ & /^[b-e]$/ = /^[b-d]$/ > かな。しかし /[a-d]/ & /[b-e]/ がどうあるべきかは良く分からない > です。 > > foo =~ (/[a-d]/ & /[b-e]/) > > が、foo =~ /[b-d]/ となるのか foo =~ /[a-d]/ && foo =~ /[b-e]/ > と同値であるべきか良く分からない。(多分実装も無理ですね。) > > 否定は(~~~ と書くと) ~~~ /^\d$/ は多分 /^\D$/ かな。 > ~~~ /\d/ はどうあるべきかも恣意的にならざるをえないですね。 > (/\D/ か /^\D*$/ か?)本当は ~~~ ~~~ foo は foo に等し > いとありがたいのだけど。 やっぱり ~/[b-d]/ は、/^[^b-d]*$/、~/\d/ は、/^\D*$/ とするのが合理的 みたいです。(面倒なんで否定を ~ と書きます。) というのは、str =~ (~regexp) は str !~ regexp となるべく同値になって ほしいから。 で、(まあ考え方はいろいろあるかもしれなくて、これは一つの解釈なんだけ ど)「実際の」正規表現 /abc/ は「理論的な」正規表現の表記では .*abc.* に相当している考えるべきかも。そうすると 実際の => 理論的な /abc/ => .*abc.* /^abc/ => abc.* /abc$/ => .*abc /^abc$/ => abc みたいな感じですね。 と、いうことはですね。今回の仕様 /abc/ + /123/ = /abc123/ というのはやはりまずい。つまり + が理論的な連接に対応しているとす れば、 /abc/ + /123/ => .*abc.* + .*123.* = .*abc.*.*123.* <= /abc.*.*123/ となるはず。この考え方からすると /abc123/ になるのは /abc$/ + /^123/ です。この /abc$/ + /^123/ は今回の仕様では /abc$^123/ で、コンパイル エラーになりますよね。 やはり、Regexp の演算子はちょっと慎重であるべきだと思います。(^^;