From: "KISHIMOTO, Makoto" Date: 2010-05-12T10:02:01+09:00 Subject: [ruby-dev:41292] Re: 正規表現オブジェクト中のキャプチャの数 きしもとです > > if ptn.numcapturs > 0 then raise end のようにチェックするのですが、 > > > > 名前付きキャプチャもonig_number_of_capturesで数えられるのでfalse > > negativeではないですし、名前付きキャプチャは普通のキャプチャとしても働くので、 > > false positiveでもなく、問題ないはずではないでしょうか? > > 名前付きキャプチャは普通のキャプチャのようにインデックスで引けるんですが、 > 一方で名前付きキャプチャが入ると普通のカッコではキャプチャされなくなるんですよ。 > > > "でてこいいけのこい".gsub_multi([/(?こい)/, /いけ/], ["いけ", "こい"]) > TypeError: no implicit conversion from nil to integer > from (irb):14:in `[]' > from (irb):14:in `block in gsub_multi' > from (irb):12:in `gsub' > from (irb):12:in `gsub_multi' > from (irb):20 > from /home/naruse/local/ruby-trunk/bin/irb:12:in `
' /foo/, /bar/, /baz/ から /(foo)|(bar)|(baz)/ のような Regexp を作って、 マッチさせて、$~.captures.index{|x|x} で何番目がマッチしたか見つけているので、 通常のキャプチャであっても、入力中に存在すると、ずれるので困るわけです。 なので、キャプチャが入力にあったらエラーにする、というチェックを入れる、と。 名前付きキャプチャが入力にある場合も、それを見つけてエラーにするだけです。