如何将字符串分组为4?

Eug*_*kov 3 regex perl

我有字符串1234567890,我想将其格式化为1234 5678 90

我写这个正则表达式:

$str =~ s/(.{4})/$1 /g;
Run Code Online (Sandbox Code Playgroud)

但是对于这种情况,12345678这不起作用.我最后得到了多余的空格:

>>1234 5678 <<
Run Code Online (Sandbox Code Playgroud)

我试着用lookahead重写正则表达式:

s/((?:.{4})?=.)/$1 /g;
Run Code Online (Sandbox Code Playgroud)

如何重写正则表达式来修复这种情况?

Bor*_*din 8

只是用 unpack

use strict;
use warnings 'all';

for ( qw/ 12345678 1234567890 / ) {
    printf ">>%s<<\n", join ' ', unpack '(A4)*';
}
Run Code Online (Sandbox Code Playgroud)

产量

>>1234 5678<<
>>1234 5678 90<<
Run Code Online (Sandbox Code Playgroud)


Sin*_*nür 6

上下文是你的朋友:

join(' ', $str =~ /(.{1,4})/g)
Run Code Online (Sandbox Code Playgroud)

在列表上下文中,匹配将是所有四个字符块(以及任何比字符串末尾更短的块 - 由于贪婪).join将确保块由空格分隔,并且末尾没有尾随空格.

如果$str是巨大的并且临时列表会增加内存占用太多,那么您可能只想执行s///g并删除尾随空格.

我倾向于在正则表达式中使用最简单的模式.此外,我没有测量但是长串,只有一个chop可能比条件模式便宜s///g:

$ echo $'12345678\n123456789' | perl -lnE 's/(.{1,4})/$1 /g; chop; say ">>$_<<"'
>>1234 5678<<
>>1234 5678 9<<
Run Code Online (Sandbox Code Playgroud)