From: Shin-ichiro HARA Date: 1997-12-10T18:04:12+09:00 Subject: [ruby-dev:1033] Re: Regexp#operators (Re: ruby 1.1b1 released) 原です。 From: matz@netlab.co.jp (Yukihiro Matsumoto) Subject: [ruby-dev:1030] Re: Regexp#operators (Re: ruby 1.1b1 released) Date: Wed, 10 Dec 97 17:05:11 +0900 > まつもと ゆきひろです > > In message "[ruby-dev:1028] Regexp#operators (Re: ruby 1.1b1 released)" > on 97/12/10, Shin-ichiro HARA writes: > > |原です。 > | > |正規表現を細かい部品を組み合わせて書くことができたらいいなと > |思っていました。 > わざ > わざコンパイルたり,元の文字列を取り出したりするのは無駄な気 > がします. 確かに。(^^; 本来はコンパイル後のオブジェクト(?)自身の演算 が出来れば理想的だけどいくらなんでもそれは無理なんでしょうね。 > いや,正直いうと個人的にはそういう場合には文字列を組み合わせ > てRegexp.compileを使って欲しいと思っているんですけどね. なるほど。まあでも a = "foo"; b = "bar" c = /(?:#{a})|(?:#{b})/ とか、いちいち括弧をつけたりするのって結構面倒だと思うので、今回 の演算子は結構便利だと思います。 > |後、積(*)、商(/)もあるといいですけど、難しいですかね。 > |差し当たって、 > | > |/foo/ * /bar/ = /(?=bar)foo/ > |/foo/ / /bar/ = /(?!bar)foo/ > | > |で代用してしまうとか。「否定」は // / /foo/ と同値かな。 > > すいません.なんか正規表現の演算の意味が良く分かんないんです > けど….正規表現の積ってなに? 商はもっと分かんないなあ. 積(&)は共通部分です。例えば /^[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 に等し いとありがたいのだけど。 もし積と否定が定義されているなら、商は foo / bar = foo & ~~~bar で作ってしまうと。もちろん、ド・モルガンの法則 foo & bar = ~~~(~~~foo | ~~~bar) で、& も ~~~, | から作れるのだけど。 まあ、そんな数学の先生みたいな事を言ってもしょうがない。(^^; ある程度便利に使える演算子ならいいんで、さっきは (?=) と (?!) を使った例をあげたのです。 > # 本当はIconでいうところの str =~ (re1|re2) などの方が欲しい > # んですけど….これはre1またはre2にマッチする時,真という演 > # 算子です.どうやって実装するんだろう? あ、やっぱりそいうのは可能なんですね。 (実は今回の ruby での実装と同じだったりして。)