きくたにです。

正規表現がわかりません。

まずは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/