[#28446] named capture and /g, /G option — "K.Kosako" <sndgk393@...>

Ruby 1.9に、

30 messages 2006/03/21
[#28449] Re: named capture and /g, /G option — "K.Kosako" <sndgk393@...> 2006/03/21

> Ruby 1.9に、

[#28452] Re: named capture and /g, /G option — Yukihiro Matsumoto <matz@...> 2006/03/21

まつもと ゆきひろです

[#28453] Re: named capture and /g, /G option — "K.Kosako" <sndgk393@...> 2006/03/21

Yukihiro Matsumoto wrote:

[ruby-dev:28489] Re: named capture and /g, /G option

From: "K.Kosako" <sndgk393@...>
Date: 2006-03-30 07:58:34 UTC
List: ruby-dev #28489
Yukihiro Matsumoto wrote:
> |> そろそろ、/g, /Gオプションの追加を実装しようかと
> |> 考えていますが、オプション値の定数名は以下の
> |> 名前で良いでしょうか?
> |
> |そもそも必要なのかなぁ、という疑問がやっぱりあるんですが、ど
> |のくらい使いたくなるのか g, G を実装する前にしばらく使ってみ
> |るみるというのはどうでしょう。
> 
> そう言われると迷ってしまいますね。毅然としない私。
> では、オプション値は追加するが、オプションは後回しではどうで
> しょう?

誰かが必要性を示すまで、何も入れずに保留としておきます。
そのときに私が生きている保証もないので、既に作って
しまったパッチを以下に示しておきます。
--
小迫

--- /home/kosako/ruby_lang_org/ruby/re.c	2006-03-26 21:52:36.427444000 +0900
+++ re.c	2006-03-29 22:45:34.554899200 +0900
@@ -159,8 +159,8 @@ rb_memsearch(char *x0, long m, char *y0,
 #define KCODE_FIXED FL_USER4
 #define KCODE_MASK (KCODE_EUC|KCODE_SJIS|KCODE_UTF8)

-#define ARG_REG_OPTION_MASK   0x0f
-#define ARG_KCODE_UNIT        16
+#define ARG_REG_OPTION_MASK  ((ONIG_OPTION_CAPTURE_GROUP<<1) - 1)
+#define ARG_KCODE_UNIT        (ONIG_OPTION_CAPTURE_GROUP<<1)
 #define ARG_KCODE_NONE       (ARG_KCODE_UNIT * 1)
 #define ARG_KCODE_EUC        (ARG_KCODE_UNIT * 2)
 #define ARG_KCODE_SJIS       (ARG_KCODE_UNIT * 3)
@@ -185,6 +185,12 @@ static int char_to_option(int c)
     case 'm':
       val = ONIG_OPTION_MULTILINE;
       break;
+    case 'g':
+      val = ONIG_OPTION_DONT_CAPTURE_GROUP;
+      break;
+    case 'G':
+      val = ONIG_OPTION_CAPTURE_GROUP;
+      break;
     default:
       val = 0;
       break;
@@ -417,6 +423,10 @@ rb_reg_desc(const char *s, long len, VAL
 	    rb_str_buf_cat2(str, "i");
 	if (RREGEXP(re)->ptr->options & ONIG_OPTION_EXTEND)
 	    rb_str_buf_cat2(str, "x");
+	if (RREGEXP(re)->ptr->options & ONIG_OPTION_DONT_CAPTURE_GROUP)
+	    rb_str_buf_cat2(str, "g");
+	if (RREGEXP(re)->ptr->options & ONIG_OPTION_CAPTURE_GROUP)
+	    rb_str_buf_cat2(str, "G");

 	if (FL_TEST(re, KCODE_FIXED)) {
 	    switch ((RBASIC(re)->flags & KCODE_MASK)) {
@@ -631,11 +641,13 @@ rb_reg_casefold_p(VALUE re)
  *     Regexp::IGNORECASE                  #=> 1
  *     Regexp::EXTENDED                    #=> 2
  *     Regexp::MULTILINE                   #=> 4
+ *     Regexp::DONT_CAPTURE_GROUP          #=> 128
+ *     Regexp::CAPTURE_GROUP               #=> 256
  *
- *     /cat/.options                       #=> 128
- *     /cat/ix.options                     #=> 131
- *     Regexp.new('cat', true).options     #=> 129
- *     Regexp.new('cat', 0, 's').options   #=> 384
+ *     /cat/.options                       #=> 64
+ *     /cat/ix.options                     #=> 67
+ *     Regexp.new('cat', true).options     #=> 65
+ *     Regexp.new('cat', 0, 's').options   #=> 48
  *
  *     r = /cat/ix
  *     Regexp.new(r.source, r.options)     #=> /cat/ix
@@ -2346,6 +2358,8 @@ Init_Regexp(void)
     rb_define_const(rb_cRegexp, "IGNORECASE",
INT2FIX(ONIG_OPTION_IGNORECASE));
     rb_define_const(rb_cRegexp, "EXTENDED", INT2FIX(ONIG_OPTION_EXTEND));
     rb_define_const(rb_cRegexp, "MULTILINE",
INT2FIX(ONIG_OPTION_MULTILINE));
+    rb_define_const(rb_cRegexp, "DONT_CAPTURE_GROUP",
INT2FIX(ONIG_OPTION_DONT_CAPTURE_GROUP));
+    rb_define_const(rb_cRegexp, "CAPTURE_GROUP",
INT2FIX(ONIG_OPTION_CAPTURE_GROUP));

     rb_global_variable(&reg_cache);



In This Thread