我有一个像600000
的号码。我想在每两位数之后插入空格。我该怎么做?结果应为60 00 00
。
答案 0 :(得分:7)
如果12345
成为12 34 5
,我建议
s/..(?!\z)\K/ /sg
(?!\z)
确保您不添加尾随空格。
如果12345应该成为1 23 45
,我建议
s/(?!^)(?=(?:..)+(?!.))/ /sg
(?!^)
可确保您不添加前导空格。
效率不高。 reverse
输入可能更有效,使用第一个解决方案,然后reverse
输出。
答案 1 :(得分:5)
比较了几种不同的方法。我假设您不想修改原始字符串,否则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) },
});
似乎使用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% --
答案 2 :(得分:3)
试试这个:
$number = '600000';
$number =~ s/(\d{2})(?!$)/$1 /g;
print $number;
(\d{2})
表示'两位数'。 (?!$)
表示“只要字符串的结尾不会立即发生”,因为数字后面不需要空格。
答案 3 :(得分:2)
这是另一种选择:
use strict;
use warnings;
my $number = 600000;
my $spacedNum = join ' ', $number =~ /..?/g;
print $spacedNum;
输出:
60 00 00