

900字程度の英語の文章があるとします。

これを300文字ずつで区切りたいのですが、英語だとスペースのところで区切らないと単語が途中で切れてしまいます。

正確に300文字で区切る必要はなく、3００文字前後で大丈夫なので、Rubyで出来るだけ短いコードやgemなどで単語が途中で切れない形で文章を分割する方法を教えてもらえないでしょうか？


CC BY-SA 3.0
2016-07-21T09:36:01.587
27792
2018-11-11T13:38:20.810
2016-07-21T10:55:36.640
76
17247
question
ruby
英語の文章を大体の文字数で、スペースのところで区切る方法


metroplisさんに回答頂きましたので共有いたします

例えば arr = text.scan(/.{1,300}[ \t,.]/m) でしょうか。ただ、この場合には "(ダブルクォート)や
'(シングルクォート)で囲まれた文字列がその範囲内で分割されてしまう事があります。


CC BY-SA 3.0
2016-07-23T11:45:27.493
27822
2016-07-23T11:45:27.493
17247
27792
answer


ちょっと大げさですが、Railsのactionviewにある[ActionView::Helpers::TextHelper#word_wrap](http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#method-
i-word_wrap)を使うという手もあります。Railsを使っているのであれば、素直にこっちを使った方が良いかと思います。

[code]

    # frozen_string_literal: true
    require 'action_view'
    include ActionView::Helpers::TextHelper
    
    sample_str = <<EOS
    We are about to study the idea of a computational process. Computational processes are abstract beings that inhabit computers. As they evolve, processes manipulate other abstract things called data. The evolution of a process is directed by a pattern of rules called a program. People create programs to direct processes. In effect, we conjure the spirits of the computer with our spells.
    EOS
    
    wrapped_str = word_wrap(sample_str, line_width: 40)
    puts wrapped_str
    
[/code]

※ サンプルテキストはSICPの第1章冒頭より引用


CC BY-SA 3.0
2016-07-23T12:16:27.500
27823
2016-07-23T12:16:27.500
7347
27792
answer

[code]

    def ans(list, str, split_size, split_hope_size)
      if !str[split_size-1]
        list << str
      elsif str[split_size-1] == " "
        ans(list << str[0...split_size], str[split_size...str.size], split_hope_size, split_hope_size)
      else
        ans(list, str, split_size - 1, split_hope_size)
      end
    end
    
    ans([], str.gsub("\n", " "), 300, 300).each do |line|
      puts line
    end
    
[/code]


CC BY-SA 4.0
2018-11-11T13:38:20.810
50213
2018-11-11T13:38:20.810
30913
27792
answer