真空マッチ (3)

/((a)*(b)*)*/ =~ "abax"のキャプチャ結果が、$1 = '', $2 = nil, $3 = nilになるというのは、次のように解釈できる。
一番外側の繰り返しの二周目で、一周目のキャプチャ結果をクリア(nil)にしてから改めてマッチングを試みる。その結果、(a)*と(b)*が零回繰り返しとなり、一度もキャプチャされないのでnilが最終結果になる。
あるいは、あるキャプチャを含んでいるパターンのマッチングの中で、そのキャプチャ部分が飛ばされたとき(零回繰り返しになる場合)には、結果がnilにセットされるという解釈でも良い。

しかし、以下のパターンのように、選択肢によってキャプチャが飛ばされる場合には、そのような動作にはなっていない。

$ ruby19 -e '"a" =~ /((a)|)*/; print "#{$&}:#{$1}:#{$2}\n"'
a::a
$ perl   -e '"a" =~ /((a)|)*/; print "#{$&}:#{$1}:#{$2}\n"'
#{a}:#{}:#{a}

従って、キャプチャが飛ばされたときにキャプチャ結果をクリアするよりも、以前のキャプチャ結果のままである仕様のほうが、一貫していると言える。