diff options
Diffstat (limited to 'mrblib/string.rb')
| -rw-r--r-- | mrblib/string.rb | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/mrblib/string.rb b/mrblib/string.rb index 6f698e321..7add360a8 100644 --- a/mrblib/string.rb +++ b/mrblib/string.rb @@ -54,17 +54,22 @@ class String # ISO 15.2.10.5.18 def gsub(*args, &block) if args.size == 2 - s = "" - i = 0 - while j = index(args[0], i) - seplen = args[0].length - k = j + seplen - pre = self[0, j] - post = self[k, length-k] - s += self[i, j-i] + args[1].__sub_replace(pre, args[0], post) - i = k + pattern, replace = *args + plen = pattern.length + replace = replace.to_str + offset = 0 + result = [] + while found = index(pattern, offset) + result << self[offset, found - offset] + offset = found + plen + result << replace.__sub_replace(self[0, found], pattern, self[offset..-1] || "") + if plen == 0 + result << self[offset, 1] + offset += 1 + end end - s + self[i, length-i] + result << self[offset..-1] if offset < length + result.join elsif args.size == 1 && block split(args[0], -1).join(block.call(args[0])) else |
