【perl】數字中增加逗號
阿新 • • 發佈:2018-12-05
#!/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;