Commit 8ca98231 authored by Yukihiro "Matz" Matsumoto's avatar Yukihiro "Matz" Matsumoto Committed by GitHub

Merge pull request #3536 from ksss/string-sub

Fix result if pattern is empty
parents 3703aed7 63c0044b
...@@ -124,15 +124,31 @@ class String ...@@ -124,15 +124,31 @@ class String
# #
# ISO 15.2.10.5.36 # ISO 15.2.10.5.36
def sub(*args, &block) def sub(*args, &block)
if args.size == 2 unless (1..2).include?(args.length)
pre, post = split(args[0], 2) raise ArgumentError, "wrong number of arguments (given #{args.length}, expected 2)"
return self unless post # The sub target wasn't found in the string end
pre + args[1].__sub_replace(pre, args[0], post) + post
elsif args.size == 1 && block pattern, replace = *args
split(args[0], 2).join(block.call(args[0])) pattern = pattern.to_str
if args.length == 2 && block
block = nil
end
if !block
replace = replace.to_str
end
result = []
this = dup
found = index(pattern)
return this unless found
result << this[0, found]
offset = found + pattern.length
result << if block
block.call(pattern).to_s
else else
raise ArgumentError, "wrong number of arguments" replace.__sub_replace(this[0, found], pattern, this[offset..-1] || "")
end end
result << this[offset..-1] if offset < length
result.join
end end
## ##
......
...@@ -585,6 +585,16 @@ assert('String#sub', '15.2.10.5.36') do ...@@ -585,6 +585,16 @@ assert('String#sub', '15.2.10.5.36') do
assert_equal 'aBcabc', 'abcabc'.sub('b', 'B') assert_equal 'aBcabc', 'abcabc'.sub('b', 'B')
assert_equal 'aBcabc', 'abcabc'.sub('b') { |w| w.capitalize } assert_equal 'aBcabc', 'abcabc'.sub('b') { |w| w.capitalize }
assert_equal 'aa$', 'aa#'.sub('#', '$') assert_equal 'aa$', 'aa#'.sub('#', '$')
assert_equal '.abc', "abc".sub("", ".")
str = "abc"
miss = str.sub("X", "Z")
assert_equal str, miss
assert_not_equal str.object_id, miss.object_id
a = []
assert_equal '.abc', "abc".sub("") { |i| a << i; "." }
assert_equal [""], a
end end
assert('String#sub with backslash') do assert('String#sub with backslash') do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment