[#41278] [BUG:1.9] BINARY should not be ASCII-compatible — Yugui <yugui@...>

WXVndWkbJEIkRyQ5ISMbKEIKCgo+IBskQiRHISIkKiQqJGAkTSQzJDMkXiRHJE41RE9AJEclKyVQ

15 messages 2010/05/11

[#41407] [Bug #3339] win32ole test failure — Usaku NAKAMURA <redmine@...>

Bug #3339: win32ole test failure

20 messages 2010/05/25
[#41411] Re: [Bug #3339] win32ole test failure — Masaki Suketa <masaki.suketa@...> 2010/05/25

助田です。

[#41412] Re: [Bug #3339] win32ole test failure — "U.Nakamura" <usa@...> 2010/05/25

こんにちは、なかむら(う)です。

[ruby-dev:41244] Re: 正規表現オブジェクト中のキャプチャの数

From: "NARUSE, Yui" <naruse@...>
Date: 2010-05-09 22:25:47 UTC
List: ruby-dev #41244
成瀬です。

(2010/05/08 15:51), KISHIMOTO, Makoto wrote:
> きしもとです
> 
> 正規表現オブジェクトからキャプチャの数を返すメソッドが欲しいです。
> (鬼車には onig_number_of_captures という関数でそういう API があります)
> 
> static VALUE
> numcaptures(VALUE re)
> {
>      regex_t *reg = RREGEXP(re)->ptr;
>      int capts = onig_number_of_captures(reg);
>      return INT2NUM(capts);
> }
> 
> rb_define_method(rb_cRegexp, "numcaptures",&numcaptures, 0);
> 
> どういう風に使うか、ですが、以下のようなメソッドで防御的コーディングのために
> 使います。
> 
> class String
> 
> def gsub_multi ptns, alts
>      res = []
>      ptns.each{|ptn|
>            # ※ここでチェックしたい
>          re = Regexp.compile "(#{ptn.to_s})"
>          res<<  re
>      }
>      uptn = Regexp.union *res
>      gsub(uptn){
>          idx = $~.captures.index{|x|x}
>          alts[idx]
>      }
> end
> 
> end
> 
> 以下のように使うメソッドです。
> 
> "でてこいいけのこい".gsub_multi([/こい/, /いけ/], ["いけ", "こい"])
> =>  "でていけこいのいけ"
> (gsub の繰り返しではうまくありません)
> 
> ここで、ptnsで与えられた正規表現中にキャプチャーがあると、インデックスが
> ずれてうまくありません。なので、正規表現中にキャプチャがないことを
> (いくつあるか、という情報はこの目的には過剰ですが)確認したい、
> というわけです。

onig_number_of_captures に相当するメソッドはあってもよいかなとは思うのですが、
* メソッド名
* そのユースケースでは onig_number_of_captures を使っても完全ではない
が気になります。

具体的には、名前付きキャプチャが混ざった場合、そのコードは動かなくなります。
思うに、番号ではなく、名前で引いた方がいいんじゃないでしょうか。


ちなみに、Ruby 1.9 では String#gsub が拡張されていて、以下のようなことができます。

"でてこいいけのこい".gsub(/こい|いけ/, "こい"=>"いけ", "いけ"=>"こい")
=> "でていけこいのいけ"

-- 
NARUSE, Yui  <[email protected]>

In This Thread