我是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], " " }
,但它似乎没有做任何事情。
任何帮助都会很棒!
答案 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]
始终是整个字符串。