diff --git a/ext/jruby/org/jruby/ext/strscan/RubyStringScanner.java b/ext/jruby/org/jruby/ext/strscan/RubyStringScanner.java index 0b4d6338ff..89e7e09a05 100644 --- a/ext/jruby/org/jruby/ext/strscan/RubyStringScanner.java +++ b/ext/jruby/org/jruby/ext/strscan/RubyStringScanner.java @@ -901,9 +901,14 @@ public IRubyObject captures(ThreadContext context) { newAry = RubyArray.newArray(runtime, numRegs); for (i = 1; i < numRegs; i++) { - IRubyObject str = extractRange(runtime, + IRubyObject str; + if (REGION_ADAPTER.getBeg(regs, i) == -1) { + str = context.nil; + } else { + str = extractRange(runtime, adjustRegisterPosition(REGION_ADAPTER.getBeg(regs, i)), adjustRegisterPosition(REGION_ADAPTER.getEnd(regs, i))); + } newAry.push(str); } diff --git a/ext/strscan/strscan.c b/ext/strscan/strscan.c index a2bf56ce4f..7dbd971ae9 100644 --- a/ext/strscan/strscan.c +++ b/ext/strscan/strscan.c @@ -1243,10 +1243,10 @@ strscan_size(VALUE self) * If nothing was priorly matched, it returns nil. * * s = StringScanner.new("Fri Dec 12 1975 14:39") - * s.scan(/(\w+) (\w+) (\d+) /) # -> "Fri Dec 12 " - * s.captures # -> ["Fri", "Dec", "12"] - * s.scan(/(\w+) (\w+) (\d+) /) # -> nil - * s.captures # -> nil + * s.scan(/(\w+) (\w+) (\d+) (1980)?/) # -> "Fri Dec 12 " + * s.captures # -> ["Fri", "Dec", "12", nil] + * s.scan(/(\w+) (\w+) (\d+) (1980)?/) # -> nil + * s.captures # -> nil */ static VALUE strscan_captures(VALUE self) @@ -1262,9 +1262,13 @@ strscan_captures(VALUE self) new_ary = rb_ary_new2(num_regs); for (i = 1; i < num_regs; i++) { - VALUE str = extract_range(p, - adjust_register_position(p, p->regs.beg[i]), - adjust_register_position(p, p->regs.end[i])); + VALUE str; + if (p->regs.beg[i] == -1) + str = Qnil; + else + str = extract_range(p, + adjust_register_position(p, p->regs.beg[i]), + adjust_register_position(p, p->regs.end[i])); rb_ary_push(new_ary, str); } diff --git a/test/strscan/test_stringscanner.rb b/test/strscan/test_stringscanner.rb index 2fce4c3e74..29626b159f 100644 --- a/test/strscan/test_stringscanner.rb +++ b/test/strscan/test_stringscanner.rb @@ -737,8 +737,8 @@ def test_size def test_captures s = create_string_scanner("Timestamp: Fri Dec 12 1975 14:39") s.scan("Timestamp: ") - s.scan(/(\w+) (\w+) (\d+) /) - assert_equal(["Fri", "Dec", "12"], s.captures) + s.scan(/(\w+) (\w+) (\d+) (1980)?/) + assert_equal(["Fri", "Dec", "12", nil], s.captures) s.scan(/(\w+) (\w+) (\d+) /) assert_nil(s.captures) end