我有字符串1234567890,我想将其格式化为1234 5678 90
我写这个正则表达式:
$str =~ s/(.{4})/$1 /g;
但是对于这种情况,12345678这不起作用.我最后得到了多余的空格:
>>1234 5678 <<
我试着用lookahead重写正则表达式:
s/((?:.{4})?=.)/$1 /g;
如何重写正则表达式来修复这种情况?
只是用 unpack
use strict;
use warnings 'all';
for ( qw/ 12345678 1234567890 / ) {
    printf ">>%s<<\n", join ' ', unpack '(A4)*';
}
>>1234 5678<<
>>1234 5678 90<<
上下文是你的朋友:
join(' ', $str =~ /(.{1,4})/g)
在列表上下文中,匹配将是所有四个字符块(以及任何比字符串末尾更短的块 - 由于贪婪).join将确保块由空格分隔,并且末尾没有尾随空格.
如果$str是巨大的并且临时列表会增加内存占用太多,那么您可能只想执行s///g并删除尾随空格.
我倾向于在正则表达式中使用最简单的模式.此外,我没有测量但是长串,只有一个chop可能比条件模式便宜s///g:
$ echo $'12345678\n123456789' | perl -lnE 's/(.{1,4})/$1 /g; chop; say ">>$_<<"'
>>1234 5678<<
>>1234 5678 9<<