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

Kyl*_*lsh 10 regex string perl

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

我想避免一次循环一个字符或者如果可以的话使用substr,我宁愿编辑这个字符串而不是创建新的字符串对象.然而,这些只是偏好,如果我不能在不打破这些偏好的情况下实现我正在寻找的东西,那就没关系了.

思考?

Fri*_*ner 23

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

根据您的需要,甚至可以选择GNU核心实用程序fold(1).


Wel*_*bog 13

s/(.{70}[^\s]*)\s+/$1\n/
Run Code Online (Sandbox Code Playgroud)

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

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


yst*_*sth 7

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

s/(.{1,79}\S|\S+)\s+/$1\n/g;
Run Code Online (Sandbox Code Playgroud)

在现代的perl中:

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


cub*_*bit 5

使用Text :: Format可以获得更多,更多的控制和可靠性

use Text::Format;
print Text::Format->new({columns => 70})->format($text);
Run Code Online (Sandbox Code Playgroud)


Dew*_*gan 5

这是我一直用的。

与公认的解决方案不同,它会在换行长度之前换行(在本例中为 70 个字符),除非有一个非常长的没有空格的“单词”(例如 URL),在这种情况下,它只会将该单词放在其上自己的线,而不是打破它。

s/(?=.{70,})(.{0,70}\n?)( )/\1\2\n /g
Run Code Online (Sandbox Code Playgroud)

第二种形式处理所有行结尾:Mac \r、Unix \n、Windows \r\n 和 Teletype \n\r,但它使用哪一个作为替换仍然取决于您在替换子句中放入的内容: I'已经使用过\n。

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

两个版本都会在第一个之后将所有换行缩进一个空格:如果您不希望的话,请删除最后一个 /g 之前的空格,但我通常发现它更好。