1. 程式人生 > >【perl】數字中增加逗號

【perl】數字中增加逗號

#!/usr/bin/perl

use strict;
use warnings;
my $num = 1234556789;
#純資料模式
$num =~ s/(?<=\d)(?=(\d{3})+$)/,/g; #零寬斷言,(?=exp)匹配exp前面的位置
print $num,"\n";
#帶有小數點模式
$num = 123456.1234;
$num =~ s/(?<!\.\d)(?<=\d)(?=(\d{3})+\b)/,/g;
print $num,"\n";
#小數位大於4位之後,使用下面的方法
#\K 模式,可變長否定向後環視;\K容許在它之前的模式只匹配而不被替換。替換操作只對\K之後的字串部分有效。
#連續匹配:\G,\G 定位標記指定匹配必須出現在上一個匹配結束的地方。
$num = 1234567.12345;
$num =~ s/(?<!\.)(?:\b|\G)\d+?\K(?=(\d{3})+\b)/,/g;
print $num,"\n";

# (?<!\.) 該位置之前補包含.
# (?:\b|\G)單詞開頭後或上一次匹配結束的地方
# \d+? 至少有一個數字,後面問號是非貪婪符號

OUTPUT:

1,234,556,789

123,456.1234

1,234,567.12345

 

匹配過程(含5位小數):

  1. 首先通過(?<!\.)(?:\b|\G)\d+?,匹配到123456;

  2. 由於\d+?是非貪婪的,所以匹配到1_234567,即匹配到1和2之間的位置;

  3. 第二次匹配,由於有\b|\G,所以上次匹配到的地方開始,即從2開始,匹配到1,234_567;


(?=exp) 零寬度正預測先行斷言,它斷言自身出現的位置的後面

能匹配表示式exp;

(?<exp) 零寬度正回顧後發斷言,它斷言自身出現的位置的前面能匹配exp;

(?!exp) 零寬度負預測先行斷言,它斷言自身出現的位置的後面不能匹配表示式exp;

(?<!exp) 零寬度負回顧後發斷言,它斷言自身出現的位置的前面不能匹配表示式exp;

 

ref: https://www.cnblogs.com/macq/p/6597366.html