From: Kikutani Makoto Date: 1997-09-01T14:49:48+09:00 Subject: [ruby-list:4013] regexp question きくたにです。 正規表現がわかりません。 まずはperlで: $_ = "abc def ghi jkl"; if (/^abc (\w+) (\w+)|^abc (\w+) (\w+) (\w+)/) { printf("\$1 = %s\n", $1); printf("\$2 = %s\n", $2); printf("\$3 = %s\n", $3); } % perl regmat-test.pl $1 = def $2 = ghi $3 = これはわかる。次に条件を if (/^abc (\w+) (\w+)$|^abc (\w+) (\w+) (\w+)$/) { に変えると、 % perl regmat-test.pl $1 = $2 = $3 = def うーむ。 if (/^abc (\w+) (\w+)$/) { printf("\$1 = %s\n", $1); printf("\$2 = %s\n", $2); printf("\$3 = %s\n", $3); } elsif (/^abc (\w+) (\w+) (\w+)$/) { printf("\$1 = %s\n", $1); printf("\$2 = %s\n", $2); printf("\$3 = %s\n", $3); } と分けて書けば、 % perl regmat-test.pl ~/ruby $1 = def $2 = ghi $3 = jkl 当然ですな。 さて、rubyでは、 $_ = "abc def ghi jkl" if /^abc (\w+) (\w+)|^abc (\w+) (\w+) (\w+)/ printf("\$1 = %s\n", $1) printf("\$2 = %s\n", $2) printf("\$3 = %s\n", $3) end % ruby regmat-test.rb $1 = $2 = $3 = def いきなりこっちですか。/^abc (\w+) (\w+)$|^abc (\w+) (\w+) (\w+)$/ の ほうに変えても同じ。 if /^abc (\w+) (\w+)$/ printf("\$1 = %s\n", $1) printf("\$2 = %s\n", $2) printf("\$3 = %s\n", $3) elsif /^abc (\w+) (\w+) (\w+)$/ printf("\$1 = %s\n", $1) printf("\$2 = %s\n", $2) printf("\$3 = %s\n", $3) end にすれば、当然 % ruby regmat-test.rb $1 = def $2 = ghi $3 = jkl よーするに、logical ORのつもりで「|」を使った正規表現を ifの条件に使って、その中で、$1とかでマッチパターンを参照するのは いかん、ということなんでしょうね。 -- 人生を背負い投げ 菊谷 誠(Kikutani Makoto) kikutani@eis.or.jp kikutani@jdc.ericsson.se hgf03701@niftyserve.or.jp http://www.eis.or.jp/muse/kikutani/