Regex Perl:每70个字符插入一个“\n”

Regex Perl:每70个字符插入一个“\n”,regex,string,perl,Regex,String,Perl,我有以下问题。我有一个长字符串,大约1000个字符,我需要每70个字符插入一个\n。我的想法是 my $finalstr; for($i=0; $i<=length($input)+1; $i=$i+70){ $finalstr.=$finalstr.substr($input,$i,3)."\n"; } 但它似乎不起作用。问题是我不知道在这种情况下如何使用正则表达式,因为$input中的字符数不能是70的倍数。考虑一下: $finalstr =~ s/(.{70

我有以下问题。我有一个长字符串,大约1000个字符,我需要每70个字符插入一个\n。我的想法是

my $finalstr;
    for($i=0; $i<=length($input)+1; $i=$i+70){
    $finalstr.=$finalstr.substr($input,$i,3)."\n";
    }
但它似乎不起作用。问题是我不知道在这种情况下如何使用正则表达式,因为$input中的字符数不能是70的倍数。

考虑一下:

$finalstr =~ s/(.{70})/$1\n/gs;
表达式。{70}捕获70个字符,然后$1\n替换为捕获的部分,后跟新行。修饰符g使搜索全局化,并替换每个匹配项

注意:如果字符串不包含嵌入的新行,则可以删除最后的s

使用4个字符而不是70个字符的示例:

$ perl -we 'my $finalstr = "123456789"; $finalstr =~ s/(.{4})/$1\n/gs; print "$finalstr\n";'
1234
5678
9
$
编辑

如所述,另一种解决方案是:

$finalstr =~ s/.{70}\K/\n/g;
理由:

\K字符类表示不应抑制其剩余部分;因此不需要捕获—这比捕获和替换更有效

删除s修饰符可避免在匹配时将新行作为字符计数;因此,如果字符串中嵌入了新行,则下一行将接受70个字符,而不仅仅是前一行的剩余字符


两个问题:在substr调用中指定值3。显然应该是70。然后两次连接到目标字符串,首先使用。=,然后重复$finalstr。您需要使用其中一个,而不是两个

纠正这一点会让你

for($i=0; $i<=length($input)+1; $i=$i+70){
    $finalstr .= substr($input,$i,70)."\n";
}

s/{70}/$&\n/g;应该还能用。任何结尾长度小于70个字符的内容都不需要修改。谢谢GMB。这很有效。但是,如果可能的话,我想请您进一步澄清。此正则表达式的意思是:在找到70个字符时,替换上一个正则表达式,即70个字符加a\n。对吗?@ele:对,对。我对我的回答补充了一些解释。谢谢!我能问你我的想法有什么问题吗?因为它似乎没有连接我的问题。@ikegami:谢谢你的宝贵建议,我将它们添加到我的答案中。@ele:请看Holli对你最初的解决方案的错误的良好回答。
for($i=70; $i<=length($input)+1; $i=$i+71){
    substr($input,$i,0) = "\n"; 
}