きくたにです。
正規表現がわかりません。
まずは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/