如果12345应该成为12 34 5,我建议
s/..(?!\z)\K/ /sg
Run Code Online (Sandbox Code Playgroud)
在(?!\z)你不添加尾随空格保证.
如果12345应该成为1 23 45,我建议
s/(?!^)(?=(?:..)+(?!.))/ /sg
Run Code Online (Sandbox Code Playgroud)
(?!^) 确保您不添加前导空格.
这不是很有效.reverse输入可能更有效,使用第一个解决方案,然后reverse输出.
比较了几种不同的方法.我假设您不想修改原始字符串,否则100%正则表达式版本可能做得更好.
#!/usr/bin/perl
use strict;
use warnings;
use Benchmark ();
my $x = "1234567890";
Benchmark::cmpthese(1_000_000, {
unpack => sub { join(" ", unpack("(A2)*", $x)) },
regex => sub { (my $y = $x) =~ s/..(?!\z)\K/ /sg; $y },
regex514 => sub { $x =~ s/..(?!\z)\K/ /sgr },
join => sub { join(" ", $x =~ /..?/sg) },
});
Run Code Online (Sandbox Code Playgroud)
似乎使用unpack()是最快的
Rate join regex regex514 unpack
join 221828/s -- -18% -26% -42%
regex 271665/s 22% -- -10% -29%
regex514 300933/s 36% 11% -- -22%
unpack 383877/s 73% 41% 28% --
Run Code Online (Sandbox Code Playgroud)