[精讚] [會員登入]

[PERL] 貪婪和不貪婪比對 non-greedy match

預設perl是貪婪比對,如果要取得不貪婪的比對,要怎麼做?

分享完整連結 //n.sfs.tw/m10698

分享連結 [PERL] 貪婪和不貪婪比對 non-greedy match@精讚
(文章歡迎轉載,請尊重版權註明連結來源)
2021-01-05 14:37:10 By 張○○

預設perl是貪婪比對,如果要取得不貪婪的比對,該怎麼做?

例如原資料

$s= "<v>4.0927331783e+01</v><v>1.1238305389e+01</v><v>2.2222222222e-05</v><v>4.9085522333e-01</v><v>1.0917031488e+01</v><v>3.1551812477e-01</v><v>2.3592746401e-01</v><v>3.2864064230e-01</v><v>0.0000000000e+00</v><v>1.3289184201e-02</v><v>0.0000000000e+00</v><v>2.7655057217e-01</v>";

如果單純想取第一筆的值,使用 =~ 運算子

print $1 if $s=~ /<v>(.*)<\/v>/;

這樣取到的 $1會是

4.0927331783e+01</v><v>1.1238305389e+01</v><v>2.2222222222e-05</v><v>4.9085522333e-01</v><v>1.0917031488e+01</v><v>3.1551812477e-01</v><v>2.3592746401e-01</v><v>3.2864064230e-01</v><v>0.0000000000e+00</v><v>1.3289184201e-02</v><v>0.0000000000e+00</v><v>2.7655057217e-01

使用不貪婪比對 (Non-greedy match),只要把 *, +, ?, {} 後面多加一個問號即可:

* => *?
+ => +?
? => ??
{} => {}?

因此,原式只要寫成這樣即可:

print $1 if $s=~ /<v>(.*?)<\/v>/;

結果:

4.0927331783e+01

 

相關連結

https://www.oreilly.com/library/view/perl-cookbook/1565922433/ch06s16.html

END
你可能有興趣

[地理] 澳洲柏斯的位置竟然比台灣還要西邊

這近我驚奇的發現,澳洲柏斯的精度竟然比臺灣甚至今晚還要來的西邊

WarSpotting 統計俄國在烏克蘭戰爭中到底是損失了多少軍事裝備或人員

這個網站可以看到俄羅斯在戰場上的軍事人員裝備損失,非常詳細

Mac上 vim的複製貼上不能用

在freebsd系統中發現vim裡的command+c沒辦法選取複製,但command+v可以貼上

check-host 從世界各地檢查你的網站能不能連線?

檢測你的網站能不能暢通?這個網站可讓你知道你的網站是不是「網際網路」還是「區域網路」?

[Smarty4] 出現 modifiers 函式不能用的問題

當我把smarty由3版更新到4.5.1版的時候,出現了Using unregistered function xx in a template這樣的錯誤,該如何解決?

[Docker] docker中要怎麼修改影像的名稱,rename image

透過 build來的image如果沒有指定名稱,事後要怎麼修改影像的名稱?