Kyl*_*lsh 10 regex string perl
我试图通过Perl中的正则表达式创建一个松散的自动换行系统.我想要的是大约每70个字符左右检查下一个空格,并用换行符替换该空格,然后对整个字符串执行此操作.我正在操作的字符串可能已经有了换行符,但换行符之间的文本量往往很长.
我想避免一次循环一个字符或者如果可以的话使用substr,我宁愿编辑这个字符串而不是创建新的字符串对象.然而,这些只是偏好,如果我不能在不打破这些偏好的情况下实现我正在寻找的东西,那就没关系了.
思考?
Wel*_*bog 13
s/(.{70}[^\s]*)\s+/$1\n/
Run Code Online (Sandbox Code Playgroud)
消耗前70个字符,然后停在下一个空格,捕获过程中的所有内容.然后,发出捕获的字符串,省略末尾的空格,添加换行符.
这并不能保证您的线路严格限制为80个字符或其他东西.不能保证它消耗的最后一个字不会长达十亿个字符.
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)
使用Text :: Format可以获得更多,更多的控制和可靠性
use Text::Format;
print Text::Format->new({columns => 70})->format($text);
Run Code Online (Sandbox Code Playgroud)
这是我一直用的。
与公认的解决方案不同,它会在换行长度之前换行(在本例中为 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 之前的空格,但我通常发现它更好。
| 归档时间: |
|
| 查看次数: |
7036 次 |
| 最近记录: |