[ruby-list:50638] Regexp部分式呼び出しとキャプチャ

From: OOTANI TAKASHI <tksotn@...117.cx>
Date: 2018-01-04 14:21:56 UTC
List: ruby-list #50638
大谷ともうします。
ちょっと腑に落ちない点があるので質問いたします。

ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-linux]

foo='(a+1)^((b+3)*2)'

p foo.gsub(/
((?<p>\((?:[^()]|\g<p>)*\)))
\^
((?<q>\((?:[^()]|\g<q>)*\)))
/x,'pow(\1,\2)')
#=> "pow(,)"

# 同じ正規表現で $1 $2 だと上手く行く
p foo.gsub(/
((?<p>\((?:[^()]|\g<p>)*\)))
\^
((?<q>\((?:[^()]|\g<q>)*\)))
/x){"pow(#{$1},#{$2})"}
#=> "pow((a+1),((b+3)*2))"

# 簡易版
p foo.gsub(/(\(.*\))\^(\(.*\))/x,'pow(\1,\2)')
#=> "pow((a+1),((b+3)*2))"

正規表現の部分式呼び出しを使うのは初めてで、
試行錯誤したため間違いがあるかも知れませんが、
1番目のケースで\1 \2が空になるのはなぜなのでしょうか?


-- 
tksotn

In This Thread

Prev Next