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

时间:2011-09-25 22:08:17

标签: ruby format line

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

例如:

我想要打印的内容:

This is a simple sentence.
This simple
sentence appears
on four lines. 

但我想将其格式化为:

This is a simple sentence. This simple
sentence appears on four lines.

我将原始的每一行都放入一个数组中。
所以x = ["This is a simple sentence.", "This simple", "sentence appears", "on three lines."]
我试过了x.each { |n| print n[0..40], " " },但它似乎没有做任何事情。

任何帮助都会很棒!

3 个答案:

答案 0 :(得分:3)

方法word_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"))

代码说明:

x.join("\n"))构建一个字符串,然后使用text.gsub(/\n/, ' ')构建一个长行。 在这种特殊情况下,可以合并这两个步骤:x.join(" "))

现在魔法

一起发生
gsub(/(.{1,#{line_width}})(\s+|$)/, "\\1\n")
  • (.{1,#{line_width}})):将任意字符带到line_width个字符。
  • (\s+|$):下一个字符必须是空格或行尾(换句话说:如果最后一个字符没有空格,则前一个匹配可能会短line_width
  • "\\1\n":取最多40个字符长的字符串并用换行符完成。
  • gsub重复包装,直至完成。

最后,我使用strip

删除前导和尾随空格

我还添加了一个长字(50个字母)。怎么了? gsub不匹配,这个词保持不变。

答案 1 :(得分:2)

puts x.join(" ").scan(/(.{1,40})(?:\s|$)/m)
  

这是一个简单的句子。这个简单的   句子出现在三行上。

答案 2 :(得分:1)

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]始终是整个字符串。