* 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
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>
|
Sun Mar 15 02:09:31 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
* proc.c (bmcall): should not uninitialized variable. a patch from
|
* 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:
|
* extended methods:
|
||||||
* Process.spawn accepts [:child, FD] for a redirect target.
|
* Process.spawn accepts [:child, FD] for a redirect target.
|
||||||
|
|
||||||
|
* String
|
||||||
|
* extended methods:
|
||||||
|
* string[regexp, name] supported.
|
||||||
|
|
||||||
* rss
|
* rss
|
||||||
|
|
||||||
* 0.2.4 -> 0.2.5
|
* 0.2.4 -> 0.2.5
|
||||||
|
@ -518,6 +518,7 @@ int rb_memcicmp(const void*,const void*,long);
|
|||||||
void rb_match_busy(VALUE);
|
void rb_match_busy(VALUE);
|
||||||
VALUE rb_reg_nth_defined(int, VALUE);
|
VALUE rb_reg_nth_defined(int, VALUE);
|
||||||
VALUE rb_reg_nth_match(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_last_match(VALUE);
|
||||||
VALUE rb_reg_match_pre(VALUE);
|
VALUE rb_reg_match_pre(VALUE);
|
||||||
VALUE rb_reg_match_post(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;
|
return num;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
rb_reg_backref_number(VALUE match, VALUE backref)
|
||||||
|
{
|
||||||
|
return match_backref_number(match, backref);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* call-seq:
|
* call-seq:
|
||||||
|
24
string.c
24
string.c
@ -3024,10 +3024,12 @@ rb_str_upto(int argc, VALUE *argv, VALUE beg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
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) {
|
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;
|
return Qnil;
|
||||||
}
|
}
|
||||||
@ -3047,7 +3049,7 @@ rb_str_aref(VALUE str, VALUE indx)
|
|||||||
return str;
|
return str;
|
||||||
|
|
||||||
case T_REGEXP:
|
case T_REGEXP:
|
||||||
return rb_str_subpat(str, indx, 0);
|
return rb_str_subpat(str, indx, INT2FIX(0));
|
||||||
|
|
||||||
case T_STRING:
|
case T_STRING:
|
||||||
if (rb_str_index(str, indx, 0) != -1)
|
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(range) => new_str or nil
|
||||||
* str.slice(regexp) => new_str or nil
|
* str.slice(regexp) => new_str or nil
|
||||||
* str.slice(regexp, fixnum) => 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
|
* str.slice(other_str) => new_str or nil
|
||||||
*
|
*
|
||||||
* Element Reference---If passed a single <code>Fixnum</code>, returns a
|
* 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.
|
* 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
|
* 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
|
* component of the <code>MatchData</code> is returned instead. If a
|
||||||
* <code>String</code> is given, that string is returned if it occurs in
|
* <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
|
* <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 (argc == 2) {
|
||||||
if (TYPE(argv[0]) == T_REGEXP) {
|
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]));
|
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
|
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;
|
VALUE match;
|
||||||
long start, end, len;
|
long start, end, len;
|
||||||
rb_encoding *enc;
|
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");
|
rb_raise(rb_eIndexError, "regexp not matched");
|
||||||
}
|
}
|
||||||
match = rb_backref_get();
|
match = rb_backref_get();
|
||||||
|
nth = rb_reg_backref_number(match, backref);
|
||||||
regs = RMATCH_REGS(match);
|
regs = RMATCH_REGS(match);
|
||||||
if (nth >= regs->num_regs) {
|
if (nth >= regs->num_regs) {
|
||||||
out_of_range:
|
out_of_range:
|
||||||
@ -3299,7 +3304,7 @@ rb_str_aset(VALUE str, VALUE indx, VALUE val)
|
|||||||
return val;
|
return val;
|
||||||
|
|
||||||
case T_REGEXP:
|
case T_REGEXP:
|
||||||
rb_str_subpat_set(str, indx, 0, val);
|
rb_str_subpat_set(str, indx, INT2FIX(0), val);
|
||||||
return val;
|
return val;
|
||||||
|
|
||||||
case T_STRING:
|
case T_STRING:
|
||||||
@ -3332,6 +3337,7 @@ rb_str_aset(VALUE str, VALUE indx, VALUE val)
|
|||||||
* str[range] = aString
|
* str[range] = aString
|
||||||
* str[regexp] = new_str
|
* str[regexp] = new_str
|
||||||
* str[regexp, fixnum] = new_str
|
* str[regexp, fixnum] = new_str
|
||||||
|
* str[regexp, name] = new_str
|
||||||
* str[other_str] = new_str
|
* str[other_str] = new_str
|
||||||
*
|
*
|
||||||
* Element Assignment---Replaces some or all of the content of <i>str</i>. The
|
* 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 (argc == 3) {
|
||||||
if (TYPE(argv[0]) == T_REGEXP) {
|
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 {
|
else {
|
||||||
rb_str_splice(str, NUM2LONG(argv[0]), NUM2LONG(argv[1]), argv[2]);
|
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));
|
return rb_ary_new3(3, str, rb_str_new(0,0),rb_str_new(0,0));
|
||||||
}
|
}
|
||||||
if (regex) {
|
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;
|
if (pos == 0 && RSTRING_LEN(sep) == 0) goto failed;
|
||||||
}
|
}
|
||||||
return rb_ary_new3(3, rb_str_subseq(str, 0, pos),
|
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({}, /(.)(.)/.named_captures)
|
||||||
|
|
||||||
assert_equal("a[b]c", "abc".sub(/(?<x>[bc])/, "[\\k<x>]"))
|
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
|
end
|
||||||
|
|
||||||
def test_assign_named_capture
|
def test_assign_named_capture
|
||||||
|
Loading…
x
Reference in New Issue
Block a user