Ruby 将输出格式化为每行40个字符

Ruby 将输出格式化为每行40个字符,ruby,format,line,Ruby,Format,Line,我是Ruby的新手,我已经在Google上搜索了几个小时了。 有人知道如何将打印输出的格式设置为不超过40个字符吗 例如: 我要打印的内容: 但我想把它格式化为: 我将原始的每一行放入一个数组中。 所以x=[这是一个简单的句子,这个简单的句子出现在三行上。] 我尝试了x.each{n | print n[0..40],},但似乎没有任何效果 任何帮助都会很棒 word\u wrap的方法需要一个Strind,并制作出一种漂亮的打印 您的数组已转换为具有join的字符串\n 守则: def wor

我是Ruby的新手,我已经在Google上搜索了几个小时了。 有人知道如何将打印输出的格式设置为不超过40个字符吗

例如:

我要打印的内容:

但我想把它格式化为:

我将原始的每一行放入一个数组中。 所以x=[这是一个简单的句子,这个简单的句子出现在三行上。] 我尝试了x.each{n | print n[0..40],},但似乎没有任何效果

任何帮助都会很棒

word\u wrap的方法需要一个Strind,并制作出一种漂亮的打印

您的数组已转换为具有join的字符串\n

守则:

def word_wrap(text, line_width = 40 ) 
  return text if line_width <= 0
  text.gsub(/\n/, ' ').gsub(/(.{1,#{line_width}})(\s+|$)/, "\\1\n").strip
end

x = ["This is a simple sentence.", "This simple", "sentence appears", "on three lines."]

puts word_wrap(x.join("\n"))
x << 'a' * 50 #To show what happens with long words
x << 'end'
puts word_wrap(x.join("\n"))
.{1,{line_width}}:取任意字符,最大为line_width字符。 \s+|$:下一个字符必须是空格或行尾,换句话说:如果最后一个字符没有空格,则上一个匹配可能比行宽短。 \\1\n:获取最长40个字符的字符串,并以换行符结束。 gsub重复包装,直到完成。 最后,我用strip删除了前导空格和尾随空格


我还加了一个长单词50A。会发生什么?gsub不匹配,单词保持原样。

Ruby 1.9且效率不高:

>> x.join(" ").each_char.each_slice(40).to_a.map(&:join)
=> ["This is a simple sentence. This simple s", "entence appears on three lines."]
解决方案不起作用的原因是所有单个字符串都少于40个字符,因此n[0..40]始终是整个字符串

puts x.join(" ").scan(/(.{1,40})(?:\s|$)/m)
这是一个简单的句子。这很简单 这个句子有三行


好吧,这在很大程度上是有道理的。不过,gsub的一些人在干什么?我得到了第一个,但是gsub/{1,{line\u width}}\s+$/,\\1\n有点混乱。你能解释一下这是怎么回事吗?它工作得很好,这就是实际的换行。\1是对在regexp中的匹配组whats之间找到的内容的反向引用。{1,40}是设置匹配长度的一种方法。{line_width}是rubys string replace变量,它在正则表达式和双引号字符串中都可用。非常好,尽管很神秘。我会注意到结果是一个数组,所以如果你想把它变成一个字符串,你必须.flatte.join结果。@M.AnthonyAiello,不需要.flatte before.join。
gsub(/(.{1,#{line_width}})(\s+|$)/, "\\1\n")
>> x.join(" ").each_char.each_slice(40).to_a.map(&:join)
=> ["This is a simple sentence. This simple s", "entence appears on three lines."]
puts x.join(" ").scan(/(.{1,40})(?:\s|$)/m)