任意の文字列に対して、ある文字数毎に区切り文字列を入れたものを取得したい
文字数のカウントを見たいために、対象の文字列を、ある文字数ごとに、区切りの文字列で置き替えた文字列を作成したいとします。
このとき、文字数毎というのは、たとえば5文字毎に区切り文字を入れたいとする場合、元の文字列を□□□□□□□□□□□□□□□□□□□□
、区切り文字を■
とした時、
□□□□■□□□□■□□□□■□□□□■
~~~~|~~~~|~~~~|~~~~
4+1 |4+1 |4+1 |4+1
といった文字列になるようなものを意図としています。
上記の実装例として、String
クラスをオープンにして、下のようなメソッドを新しく作成したとします:
class String
def step_replace(steps, replace_str)
split_str = self.split('').each_slice(steps)
range_max = steps - replace_str.length - 1
split_str.map { |x| x.slice(0..range_max) + [replace_str] }.join
end
end
このとき、このstep_replace
は下のような形で利用することが可能です。
puts ("あいうえお" * 3).step_replace(5, "んん")
# output: あいうんんあいうんんあいうんん
しかし、このstep_replace
は「文字列をいちいちsplit
で配列にしたりしたものを加工している」という点で、冗長であるように感じます。もうすこし簡潔な書き方があるような気がしましたが、如何でしょうか。それともこれ以上簡潔にはならないのでしょうか。