Skip to content

Commit

Permalink
string.c(rb_str_split_m): Handle /\K/ correctly
Browse files Browse the repository at this point in the history
Use BEG(0) instead of the result of rb_reg_search to handle the cases
when the separator Regexp contains /\K/ (lookbehind) operator.

Fixes [Bug #17113]
  • Loading branch information
hanazuki authored and nobu committed Aug 12, 2020
1 parent 66efe37 commit e79cdcf
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 1 deletion.
3 changes: 2 additions & 1 deletion string.c
Expand Up @@ -8216,11 +8216,12 @@ rb_str_split_m(int argc, VALUE *argv, VALUE str)
struct re_registers *regs;
VALUE match = 0;

for (; (end = rb_reg_search(spat, str, start, 0)) >= 0;
for (; rb_reg_search(spat, str, start, 0) >= 0;
(match ? (rb_match_unbusy(match), rb_backref_set(match)) : (void)0)) {
match = rb_backref_get();
if (!result) rb_match_busy(match);
regs = RMATCH_REGS(match);
end = BEG(0);
if (start == end && BEG(0) == END(0)) {
if (!ptr) {
SPLIT_STR(0, 0);
Expand Down
5 changes: 5 additions & 0 deletions test/ruby/test_string.rb
Expand Up @@ -1838,6 +1838,11 @@ def test_split_dupped
assert_equal("abc", s)
end

def test_split_lookbehind
assert_equal([S("ab"), S("d")], S("abcd").split(/(?<=b)c/))
assert_equal([S("ab"), S("d")], S("abcd").split(/b\Kc/))
end

def test_squeeze
assert_equal(S("abc"), S("aaabbbbccc").squeeze)
assert_equal(S("aa bb cc"), S("aa bb cc").squeeze(S(" ")))
Expand Down

0 comments on commit e79cdcf

Please sign in to comment.