如何在Perl中自动换行字符串?

时间:2009-06-05 15:09:07

标签: regex perl string

我正在尝试通过Perl中的正则表达式创建一个松散的自动换行系统。我想要的是大约每70个字符左右检查下一个空格,并用换行符替换该空格,然后对整个字符串执行此操作。我正在操作的字符串可能已经有了换行符,但换行符之间的文本量往往很长。

我想避免一次循环一个字符或者如果可以的话使用substr,我宁愿编辑这个字符串而不是创建新的字符串对象。但这些只是偏好,如果我不能在没有打破这些偏好的情况下达到我想要的目标,那就没关系了。

思想?

5 个答案:

答案 0 :(得分:23)

查看Text::WrapText::Autoformat等模块。

根据您的需要,甚至GNU核心实用程序fold(1)也可能是一种选择。

答案 1 :(得分:13)

s/(.{70}[^\s]*)\s+/$1\n/

消耗前70个字符,然后在下一个空格处停止,捕获过程中的所有内容。然后,发出捕获的字符串,省略末尾的空格,添加换行符。

这并不能保证您的线路严格限制为80个字符或其他内容。不能保证它消耗的最后一个字不会长达十亿个字符。

答案 2 :(得分:7)

Welbog的答案包含在70个字符后的第一个空格处。这有一个缺点,即在线的末端开始的长单词会产生超长线。我建议改为包装在第一个空格内,比方说81个字符,或者如果你有一个> 80字符的“单词”,则换行包裹在第一个空格,这样只有真正牢不可破的行才会过长:

s/(.{1,79}\S|\S+)\s+/$1\n/g;

在现代的perl中:

s/(?:.{1,79}\S|\S+)\K\s+/\n/g;

答案 3 :(得分:5)

使用Text::Format

可以获得更多,更多的控制和可靠性
use Text::Format;
print Text::Format->new({columns => 70})->format($text);

答案 4 :(得分:1)

这是我一直使用的那个。

与接受的解决方案不同,它将包装BEFORE包装长度(在本例中为75个字符),除非有一个非常长的字符串(例如URL),在这种情况下它只会将该字符串放在自己的线,而不是打破它。

s/(?=.{70,})(.{0,70}\n?)( )/\1\2\n /g

这第二种形式处理所有行结尾:Mac \ r \ n,Unix \ n,Windows \ r \ n和Teletype \ n \ r \ n,但它用作替代品仍取决于您在替换子句中放置的内容:我用过\ n。

s/(?=.{70,})(.{0,70}(?:\r\n?|\n\r?)?)( )/\1\2\n /g

两个版本也会在第一个空格之后缩进所有包裹的行:如果你不想要那么删除最后一个/ g之前的空格,但我通常会发现它更好。

相关问题