e$B$-$7$b$H$G$9e(B
e$B@55,I=8=%*%V%8%’%/%H$+$i%-%c%W%A%c$N?t$rJV$9%a%=%C%I$,M_$7$$$G$9!#e(B
e$B!J54<V$K$Oe(B onig_number_of_captures e$B$H$$$&4X?t$G$=$&$$$&e(B API
e$B$,$"$j$^$9!Ke(B
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);
e$B$I$&$$$&Iw$K;H$&$+!"$G$9$,!"0J2<$N$h$&$J%a%=%C%I$GKI8fE*%3!<%G%#%s%0$N$?$a$Ke(B
e$B;H$$$^$9!#e(B
class String
def gsub_multi ptns, alts
res = []
ptns.each{|ptn|
# e$B"($3$3$G%A%’%C%/$7$?$$e(B
re = Regexp.compile “(#{ptn.to_s})”
res << re
}
uptn = Regexp.union *res
gsub(uptn){
idx = $~.captures.index{|x|x}
alts[idx]
}
end
end
e$B0J2<$N$h$&$K;H$&%a%=%C%I$G$9!#e(B
“e$B$G$F$3$$$$$1$N$3$$e(B”.gsub_multi([/e$B$3$$e(B/, /e$B$$$1e(B/],
[“e$B$$$1e(B”, “e$B$3$$e(B”])
=> “e$B$G$F$$$1$3$$$N$$$1e(B”
e$B!Je(Bgsub e$B$N7+$jJV$7$G$O$&$^$/$"$j$^$;$s!Ke(B
e$B$3$3$G!“e(Bptnse$B$GM?$($i$l$?@55,I=8=Cf$K%-%c%W%A%c!<$,$”$k$H!"%$%s%G%C%/%9$,e(B
e$B$:$l$F$&$^$/$"$j$^$;$s!#$J$N$G!"@55,I=8=Cf$K%-%c%W%A%c$,$J$$$3$H$re(B
e$B!J$$$/$D$"$k$+!"$H$$$&>pJs$O$3$NL\E*$K$O2a>j$G$9$,!K3NG’$7$?$$!"e(B
e$B$H$$$&$o$1$G$9!#e(B
e$B@.@%$G$9!#e(B
(2010/05/08 15:51), KISHIMOTO, Makoto wrote:
return INT2NUM(capts);
res = []
end
e$B$:$l$F$&$^$/$"$j$^$;$s!#$J$N$G!"@55,I=8=Cf$K%-%c%W%A%c$,$J$$$3$H$re(B
e$B!J$$$/$D$"$k$+!"$H$$$&>pJs$O$3$NL\E*$K$O2a>j$G$9$,!K3NG’$7$?$$!"e(B
e$B$H$$$&$o$1$G$9!#e(B
onig_number_of_captures
e$B$KAjEv$9$k%a%=%C%I$O$"$C$F$b$h$$$+$J$H$O;W$&$N$G$9$,!"e(B
- e$B%a%=%C%IL>e(B
- e$B$=$N%f!<%9%1!<%9$G$Oe(B onig_number_of_captures
e$B$r;H$C$F$b40A4$G$O$J$$e(B
e$B$,5$$K$J$j$^$9!#e(B
e$B6qBNE*$K$O!“L>A0IU$-%-%c%W%A%c$,:.$6$C$?>l9g!”$=$N%3!<%I$OF0$+$J$/$J$j$^$9!#e(B
e$B;W$&$K!"HV9f$G$O$J$/!"L>A0$G0z$$$?J}$,$$$$$s$8$c$J$$$G$7$g$&$+!#e(B
e$B$A$J$_$K!"e(BRuby 1.9 e$B$G$Oe(B String#gsub
e$B$,3HD%$5$l$F$$$F!"0J2<$N$h$&$J$3$H$,$G$-$^$9!#e(B
“e$B$G$F$3$$$$$1$N$3$$e(B”.gsub(/e$B$3$$e(B|e$B$$$1e(B/,
“e$B$3$$e(B”=>“e$B$$$1e(B”, “e$B$$$1e(B”=>“e$B$3$$e(B”)
=> “e$B$G$F$$$1$3$$$N$$$1e(B”
e$B$?$k$$$H$$$$$^$9!#e(B
e$B@N@55,I=8=%(%s%8%s$N%*!<%H%^%H%s:GE,2=$r$“$F$K$7$?;z6g2r@O5!$r:n$l$Pe(Brubye$B$Ge(Bstrscane$B$rJB$Y$k$h$je(B
e$B9bB.$K$J$k$s$8$c$J$$$+$H;n$_$?;v$,$”$j$^$7$?!#e(B
e$B$=$l<+BN$O7k6Ie(BMatchDatae$B$+$i$N@Z$j=P$7%3%9%H$,7k9=Bg$-$+$C$?$N$G$*B"F~$j$5$;$?$N$G$9$,!“e(B
e$B$=$N;~$b%-%c%W%A%c?t$,I,MW$K$J$C$F!”<!$N$h$&$J%3!<%I$r=q$$$F$$$^$7$?!#e(B
def numcaptures(re)
/|a#{re}/.match(“”).to_a.size-1
end
e$B$“$^$jNI$$%3!<%I$G$O$J$$$H$O;W$$$^$9$,!”$-$7$b$H$5$s$NNc$K$O4V$K9g$C$F$$$k$H;W$&$N$G!"e(B
e$B$b$7Aa5^$KI,MW$J$i%a%=%C%I$NDs0F$H$OJL$K$$$+$,$G$7$g$&$+!)e(B
e$B$5$F!“@.@%$5$s$,L>A0IU$-%-%c%W%A%c$K$D$$$F8@5Z$5$l$F$$$?$N$G!“e(B
e$B>/$78=>u$Ne(BRegexpe$B$K$D$$$FD4$Y$F$_$?$N$G$9$,;EMM$K$D$$$F$h$/$o$+$i$J$$ItJ,$,e(B
e$B$”$C$?$N$G$9$,!”$=$l$OJL$K%9%l%C%I$r@Z$C$F%a!<%k$7$?$$$H;W$$$^$9!#e(B
2010e$BG/e(B5e$B7ne(B10e$BF|e(B7:25 NARUSE, Yui [email protected]:
e$B@.@%$G$9!#e(B
(2010/05/08 15:51), KISHIMOTO, Makoto wrote:
e$B$-$7$b$H$G$9e(B
e$B@55,I=8=%*%V%8%'%/%H$+$i%-%c%W%A%c$N?t$rJV$9%a%=%C%I$,M_$7$$$G$9!#e(B
e$B!J54<V$K$Oe(B onig_number_of_captures e$B$H$$$&4X?t$G$=$&$$$&e(B API e$B$,$"$j$^$9!Ke(B
(snip)
e$B@.@%$G$9!#e(B
2010e$BG/e(B5e$B7ne(B11e$BF|e(B10:27 KISHIMOTO, Makoto
[email protected]:
e$B6qBNE*$K$O!“L>A0IU$-%-%c%W%A%c$,:.$6$C$?>l9g!”$=$N%3!<%I$OF0$+$J$/$J$j$^$9!#e(B
e$B;W$&$K!"HV9f$G$O$J$/!"L>A0$G0z$$$?J}$,$$$$$s$8$c$J$$$G$7$g$&$+!#e(B
if ptn.numcapturs > 0 then raise end e$B$N$h$&$K%A%'%C%/$9$k$N$G$9$,!"e(B
e$BL>A0IU$-%-%c%W%A%c$be(Bonig_number_of_capturese$B$G?t$($i$l$k$N$Ge(Bfalse
negativee$B$G$O$J$$$G$9$7!"L>A0IU$-%-%c%W%A%c$OIaDL$N%-%c%W%A%c$H$7$F$bF/$/$N$G!"e(B
false positivee$B$G$b$J$/!"LdBj$J$$$O$:$G$O$J$$$G$7$g$&$+!)e(B
e$BL>A0IU$-%-%c%W%A%c$OIaDL$N%-%c%W%A%c$N$h$&$K%$%s%G%C%/%9$G0z$1$k$s$G$9$,!"e(B
e$B0lJ}$GL>A0IU$-%-%c%W%A%c$,F~$k$HIaDL$N%+%C%3$G$O%-%c%W%A%c$5$l$J$/$J$k$s$G$9$h!#e(B
“e$B$G$F$3$$$$$1$N$3$$e(B”.gsub_multi([/(?e$B$3$$e(B)/, /e$B$$$1e(B/], [“e$B$$$1e(B”, “e$B$3$$e(B”])
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 `’
e$B$-$7$b$H$G$9e(B
onig_number_of_captures e$B$KAjEv$9$k%a%=%C%I$O$"$C$F$b$h$$$+$J$H$O;W$&$N$G$9$,!"e(B
e$B$?$7$+$K:#$N$H$3$mB>$Ke(B num???s
e$B$H$$$&%a%=%C%I$C$F$J$$$G$9$h$M$'e(B
- e$B$=$N%f!<%9%1!<%9$G$Oe(B onig_number_of_captures e$B$r;H$C$F$b40A4$G$O$J$$e(B
e$B$,5$$K$J$j$^$9!#e(B
e$B6qBNE*$K$O!“L>A0IU$-%-%c%W%A%c$,:.$6$C$?>l9g!”$=$N%3!<%I$OF0$+$J$/$J$j$^$9!#e(B
e$B;W$&$K!"HV9f$G$O$J$/!"L>A0$G0z$$$?J}$,$$$$$s$8$c$J$$$G$7$g$&$+!#e(B
if ptn.numcapturs > 0 then raise end
e$B$N$h$&$K%A%’%C%/$9$k$N$G$9$,!"e(B
e$BL>A0IU$-%-%c%W%A%c$be(Bonig_number_of_capturese$B$G?t$($i$l$k$N$Ge(Bfalse
negativee$B$G$O$J$$$G$9$7!"L>A0IU$-%-%c%W%A%c$OIaDL$N%-%c%W%A%c$H$7$F$bF/$/$N$G!"e(B
false positivee$B$G$b$J$/!"LdBj$J$$$O$:$G$O$J$$$G$7$g$&$+!)e(B
2010e$BG/e(B5e$B7ne(B12e$BF|e(B10:02 KISHIMOTO, Makoto
[email protected]:
/foo/, /bar/, /baz/ e$B$+$ie(B /(foo)|(bar)|(baz)/ e$B$N$h$&$Je(B Regexp e$B$r:n$C$F!"e(B
e$B%^%C%A$5$;$F!"e(B$~.captures.index{|x|x} e$B$G2?HVL$,%^%C%A$7$?$+8+$D$1$F$$$k$N$G!“e(B
e$BDL>o$N%-%c%W%A%c$G$”$C$F$b!“F~NOCf$KB8:_$9$k$H!”$:$l$k$N$G:$$k$o$1$G$9!#e(B
e$B$J$N$G!“%-%c%W%A%c$,F~NO$K$”$C$?$i%(%i!<$K$9$k!“$H$$$&%A%'%C%/$rF~$l$k!”$H!#e(B
e$BL>A0IU$-%-%c%W%A%c$,F~NO$K$“$k>l9g$b!”$=$l$r8+$D$1$F%(%i!<$K$9$k$@$1$G$9!#e(B
e$BHV9f$8$c$J$/$Fe(B unique
e$B$JL>A0$r$D$1$F$7$i$Y$k$N$O$I$&$G$9$+$M!#e(B
% ruby -e ’
/(?foo)|(?bar)|(?baz)/ =~ “bar”
p %w[r0 r1 r2].index {|n| $~[n] }’
1
r1, r2, r3
e$B$J$I$NL>A0$,>WFM$7$=$&$J$i$b$C$HD9$$L>A0$K$7$F$/$@$5$$!#e(B
e$B$-$7$b$H$G$9e(B
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/ e$B$+$ie(B /(foo)|(bar)|(baz)/ e$B$N$h$&$Je(B Regexp
e$B$r:n$C$F!"e(B
e$B%^%C%A$5$;$F!"e(B$~.captures.index{|x|x}
e$B$G2?HVL$,%^%C%A$7$?$+8+$D$1$F$$$k$N$G!“e(B
e$BDL>o$N%-%c%W%A%c$G$”$C$F$b!“F~NOCf$KB8:_$9$k$H!”$:$l$k$N$G:$$k$o$1$G$9!#e(B
e$B$J$N$G!"%-%c%W%A%c$,F~NO$K$"$C$?$i%(%i!<$K$9$k!"$H$$$&%A%’%C%/$rF~$l$k!"$H!#e(B
e$BL>A0IU$-%-%c%W%A%c$,F~NO$K$"$k>l9g$b!"$=$l$r8+$D$1$F%(%i!<$K$9$k$@$1$G$9!#e(B
e$B$-$7$b$H$G$9e(B
e$B$9$C$+$jK\Bj$N$[$&$rK:$l$F$7$^$C$F$$$^$7$?$,!"e(B
onig_number_of_captures e$B$KAjEv$9$k%a%=%C%I$O$"$C$F$b$h$$$+$J$H$O;W$&$N$G$9$,!"e(B
e$B;w$?$h$&$JL>A0$H$$$&$3$H$Ge(B Array#nitems
e$B$H$$$&%a%=%C%I$,$"$k!J$"$C$?!)!K$N$re(B
e$B8+$D$1$?$N$G$9$,!"e(BRegexp#ncaptures
e$B$H$$$&$N$O$I$&$G$7$g$&$+!)e(B
MatchData#captures e$B$H$N0UL#$N%:%l$,5$$K$J$k$H$3$m$G$7$g$&$+!#e(B