mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* string.c (rb_str_subpat): accept capture name.
(rb_str_aref): follow above change. (rb_str_aref_m): pass the 2nd argument to rb_str_subpat. (rb_str_subpat_set): accept capture name. (rb_str_aset): follow above change. (rb_str_partition): ditto. (rb_str_aset_m): pass the 2nd argument to rb_str_subpat_set. * include/ruby/intern.h (rb_reg_backref_number): declared. * re.c (rb_reg_backref_number): defined. [ruby-core:21057] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@22959 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
f621b32e58
commit
f414bd65ae
6 changed files with 47 additions and 9 deletions
16
ChangeLog
16
ChangeLog
|
@ -1,3 +1,19 @@
|
|||
Sun Mar 15 02:53:13 2009 Tanaka Akira <akr@fsij.org>
|
||||
|
||||
* string.c (rb_str_subpat): accept capture name.
|
||||
(rb_str_aref): follow above change.
|
||||
(rb_str_aref_m): pass the 2nd argument to rb_str_subpat.
|
||||
(rb_str_subpat_set): accept capture name.
|
||||
(rb_str_aset): follow above change.
|
||||
(rb_str_partition): ditto.
|
||||
(rb_str_aset_m): pass the 2nd argument to rb_str_subpat_set.
|
||||
|
||||
* include/ruby/intern.h (rb_reg_backref_number): declared.
|
||||
|
||||
* re.c (rb_reg_backref_number): defined.
|
||||
|
||||
[ruby-core:21057]
|
||||
|
||||
Sun Mar 15 02:09:31 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||
|
||||
* proc.c (bmcall): should not uninitialized variable. a patch from
|
||||
|
|
4
NEWS
4
NEWS
|
@ -38,6 +38,10 @@ with all sufficient information, see the ChangeLog file.
|
|||
* extended methods:
|
||||
* Process.spawn accepts [:child, FD] for a redirect target.
|
||||
|
||||
* String
|
||||
* extended methods:
|
||||
* string[regexp, name] supported.
|
||||
|
||||
* rss
|
||||
|
||||
* 0.2.4 -> 0.2.5
|
||||
|
|
|
@ -518,6 +518,7 @@ int rb_memcicmp(const void*,const void*,long);
|
|||
void rb_match_busy(VALUE);
|
||||
VALUE rb_reg_nth_defined(int, VALUE);
|
||||
VALUE rb_reg_nth_match(int, VALUE);
|
||||
int rb_reg_backref_number(VALUE match, VALUE backref);
|
||||
VALUE rb_reg_last_match(VALUE);
|
||||
VALUE rb_reg_match_pre(VALUE);
|
||||
VALUE rb_reg_match_post(VALUE);
|
||||
|
|
5
re.c
5
re.c
|
@ -1008,6 +1008,11 @@ match_backref_number(VALUE match, VALUE backref)
|
|||
return num;
|
||||
}
|
||||
|
||||
int
|
||||
rb_reg_backref_number(VALUE match, VALUE backref)
|
||||
{
|
||||
return match_backref_number(match, backref);
|
||||
}
|
||||
|
||||
/*
|
||||
* call-seq:
|
||||
|
|
24
string.c
24
string.c
|
@ -3024,10 +3024,12 @@ rb_str_upto(int argc, VALUE *argv, VALUE beg)
|
|||
}
|
||||
|
||||
static VALUE
|
||||
rb_str_subpat(VALUE str, VALUE re, int nth)
|
||||
rb_str_subpat(VALUE str, VALUE re, VALUE backref)
|
||||
{
|
||||
if (rb_reg_search(re, str, 0, 0) >= 0) {
|
||||
return rb_reg_nth_match(nth, rb_backref_get());
|
||||
VALUE match = rb_backref_get();
|
||||
int nth = rb_reg_backref_number(match, backref);
|
||||
return rb_reg_nth_match(nth, match);
|
||||
}
|
||||
return Qnil;
|
||||
}
|
||||
|
@ -3047,7 +3049,7 @@ rb_str_aref(VALUE str, VALUE indx)
|
|||
return str;
|
||||
|
||||
case T_REGEXP:
|
||||
return rb_str_subpat(str, indx, 0);
|
||||
return rb_str_subpat(str, indx, INT2FIX(0));
|
||||
|
||||
case T_STRING:
|
||||
if (rb_str_index(str, indx, 0) != -1)
|
||||
|
@ -3091,6 +3093,7 @@ rb_str_aref(VALUE str, VALUE indx)
|
|||
* str.slice(range) => new_str or nil
|
||||
* str.slice(regexp) => new_str or nil
|
||||
* str.slice(regexp, fixnum) => new_str or nil
|
||||
* str.slice(regexp, capname) => new_str or nil
|
||||
* str.slice(other_str) => new_str or nil
|
||||
*
|
||||
* Element Reference---If passed a single <code>Fixnum</code>, returns a
|
||||
|
@ -3103,7 +3106,7 @@ rb_str_aref(VALUE str, VALUE indx)
|
|||
* is negative, or the beginning of the range is greater than the end.
|
||||
*
|
||||
* If a <code>Regexp</code> is supplied, the matching portion of <i>str</i> is
|
||||
* returned. If a numeric parameter follows the regular expression, that
|
||||
* returned. If a numeric or name parameter follows the regular expression, that
|
||||
* component of the <code>MatchData</code> is returned instead. If a
|
||||
* <code>String</code> is given, that string is returned if it occurs in
|
||||
* <i>str</i>. In both cases, <code>nil</code> is returned if there is no
|
||||
|
@ -3130,7 +3133,7 @@ rb_str_aref_m(int argc, VALUE *argv, VALUE str)
|
|||
{
|
||||
if (argc == 2) {
|
||||
if (TYPE(argv[0]) == T_REGEXP) {
|
||||
return rb_str_subpat(str, argv[0], NUM2INT(argv[1]));
|
||||
return rb_str_subpat(str, argv[0], argv[1]);
|
||||
}
|
||||
return rb_str_substr(str, NUM2LONG(argv[0]), NUM2LONG(argv[1]));
|
||||
}
|
||||
|
@ -3251,8 +3254,9 @@ rb_str_update(VALUE str, long beg, long len, VALUE val)
|
|||
}
|
||||
|
||||
static void
|
||||
rb_str_subpat_set(VALUE str, VALUE re, int nth, VALUE val)
|
||||
rb_str_subpat_set(VALUE str, VALUE re, VALUE backref, VALUE val)
|
||||
{
|
||||
int nth;
|
||||
VALUE match;
|
||||
long start, end, len;
|
||||
rb_encoding *enc;
|
||||
|
@ -3262,6 +3266,7 @@ rb_str_subpat_set(VALUE str, VALUE re, int nth, VALUE val)
|
|||
rb_raise(rb_eIndexError, "regexp not matched");
|
||||
}
|
||||
match = rb_backref_get();
|
||||
nth = rb_reg_backref_number(match, backref);
|
||||
regs = RMATCH_REGS(match);
|
||||
if (nth >= regs->num_regs) {
|
||||
out_of_range:
|
||||
|
@ -3299,7 +3304,7 @@ rb_str_aset(VALUE str, VALUE indx, VALUE val)
|
|||
return val;
|
||||
|
||||
case T_REGEXP:
|
||||
rb_str_subpat_set(str, indx, 0, val);
|
||||
rb_str_subpat_set(str, indx, INT2FIX(0), val);
|
||||
return val;
|
||||
|
||||
case T_STRING:
|
||||
|
@ -3332,6 +3337,7 @@ rb_str_aset(VALUE str, VALUE indx, VALUE val)
|
|||
* str[range] = aString
|
||||
* str[regexp] = new_str
|
||||
* str[regexp, fixnum] = new_str
|
||||
* str[regexp, name] = new_str
|
||||
* str[other_str] = new_str
|
||||
*
|
||||
* Element Assignment---Replaces some or all of the content of <i>str</i>. The
|
||||
|
@ -3354,7 +3360,7 @@ rb_str_aset_m(int argc, VALUE *argv, VALUE str)
|
|||
{
|
||||
if (argc == 3) {
|
||||
if (TYPE(argv[0]) == T_REGEXP) {
|
||||
rb_str_subpat_set(str, argv[0], NUM2INT(argv[1]), argv[2]);
|
||||
rb_str_subpat_set(str, argv[0], argv[1], argv[2]);
|
||||
}
|
||||
else {
|
||||
rb_str_splice(str, NUM2LONG(argv[0]), NUM2LONG(argv[1]), argv[2]);
|
||||
|
@ -6760,7 +6766,7 @@ rb_str_partition(VALUE str, VALUE sep)
|
|||
return rb_ary_new3(3, str, rb_str_new(0,0),rb_str_new(0,0));
|
||||
}
|
||||
if (regex) {
|
||||
sep = rb_str_subpat(str, sep, 0);
|
||||
sep = rb_str_subpat(str, sep, INT2FIX(0));
|
||||
if (pos == 0 && RSTRING_LEN(sep) == 0) goto failed;
|
||||
}
|
||||
return rb_ary_new3(3, rb_str_subseq(str, 0, pos),
|
||||
|
|
|
@ -104,6 +104,12 @@ class TestRegexp < Test::Unit::TestCase
|
|||
assert_equal({}, /(.)(.)/.named_captures)
|
||||
|
||||
assert_equal("a[b]c", "abc".sub(/(?<x>[bc])/, "[\\k<x>]"))
|
||||
|
||||
assert_equal("o", "foo"[/(?<bar>o)/, "bar"])
|
||||
|
||||
s = "foo"
|
||||
s[/(?<bar>o)/, "bar"] = "baz"
|
||||
assert_equal("fbazo", s)
|
||||
end
|
||||
|
||||
def test_assign_named_capture
|
||||
|
|
Loading…
Add table
Reference in a new issue