diff --git a/ext/strscan/strscan.c b/ext/strscan/strscan.c index f7888e2cf1..da434ae5c1 100644 --- a/ext/strscan/strscan.c +++ b/ext/strscan/strscan.c @@ -1502,6 +1502,10 @@ strscan_named_captures(VALUE self) named_captures_data data; data.self = self; data.captures = rb_hash_new(); + if (NIL_P(p->regex)) { + return data.captures; + } + onig_foreach_name(RREGEXP_PTR(p->regex), named_captures_iter, &data); return data.captures; diff --git a/test/strscan/test_stringscanner.rb b/test/strscan/test_stringscanner.rb index b7ffac816d..a2693dd34a 100644 --- a/test/strscan/test_stringscanner.rb +++ b/test/strscan/test_stringscanner.rb @@ -778,6 +778,12 @@ def test_named_captures assert_equal(9, scan.match?(/(?foo)(?bar)(?baz)/)) assert_equal({"f" => "foo", "r" => "bar", "z" => "baz"}, scan.named_captures) end + + def test_named_captures_no_match + omit("not implemented on TruffleRuby") if ["truffleruby"].include?(RUBY_ENGINE) + scan = StringScanner.new("foobarbaz") + assert_equal({}, scan.named_captures) + end end class TestStringScanner < Test::Unit::TestCase