Ruby の文字列を改行文字とスペース文字を考慮して最大長の文字列に分割します
概要
こんな長い文章があります。
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis vestibulum id augue id mattis. Praesent congue nisi quam, ac gravida enim viverra non. Vestibulum id interdum sapien, vitae volutpat nisi. Praesent id euismod ipsum. Vestibulum et pulvinar urna, id venenatis ante. Cras commodo eget ligula sit amet mattis. Maecenas congue turpis urna, a bibendum sem consequat nec.
これを(1行あたり最大50文字)に分割したいと思います。
Lorem ipsum dolor sit amet, consectetur adipiscing
elit. Duis vestibulum id augue id mattis. Praesent
congue nisi quam, ac gravida enim viverra non.
Vestibulum id interdum sapien, vitae volutpat nisi.
Praesent id euismod ipsum. Vestibulum et pulvinar
urna, id venenatis ante. Cras commodo eget ligula
sit amet mattis. Maecenas congue turpis urna, a
bibendum sem consequat nec.
単語を分割したくないので、次のことは行いません。
Lorem ipsum dolor sit amet, consectetur adipiscing
elit. Duis vestibulum id augue id mattis. Praesen
t congue nisi quam, ac gravida enim viverra non. V
estibulum id interdum sapien, vitae volutpat nisi.
Praesent id euismod ipsum. Vestibulum et pulvinar
urna, id venenatis ante. Cras commodo eget ligula
sit amet mattis. Maecenas congue turpis urna, a b
ibendum sem consequat nec.
String#index、String#splitなどを試してみました。
レールはありません、ありがとう。
私の最善の解決策で貪欲さが機能しない理由がわかりません。
str = "Lorem ipsum [etc.]"
p str
.scan(/[^ \n]{1,50}/)
.join("\n")
まだ:
str = "(again)and again)and again)"
p str.scan(/\(.+\)/).first
# => "(again)and again)and again)"
p str.scan(/\(.+?\)/).first
# => "(again)"
# My hope:
p str.scan(/\(.{1,15}\)/).first
# => "(again)and again)"
手伝ってくれてありがとう!
解決策
text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis vestibulum id augue id mattis. Praesent congue nisi quam, ac gravida enim viverra non. Vestibulum id interdum sapien, vitae volutpat nisi. Praesent id euismod ipsum. Vestibulum et pulvinar urna, id venenatis ante. Cras commodo eget ligula sit amet mattis. Maecenas congue turpis urna, a bibendum sem consequat nec."
def split_string(string, max_length)
string.scan(/\b.{1,#{max_length}}\b/m).join("\n")
end
puts split_string(text, 50)