[精讚] [會員登入]

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

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

此文完整連結 http://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

你可能有興趣

[PHP] 由於 scheme 不同,Cookie「_ga」在未來會被視為對XXX的跨網站 cookie

最近發現主控台出現這類的警告,很煩人…

[Mac] Forticlient 'Connection Error' '連接錯誤'

mac 筆電上的 forticlient突然不能連了,不知發生什麼事?

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

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

[JS/Jquery] ScreenX/Y, PageX/Y, ClientX/Y的差異

ScreenX, PageX, ClientX及ScreenY, PageY, ClientY的差異

SELINUX 中網頁放在家目錄

家目錄中要放網頁,SELINUX中該如何設定?

Linux cp 複製或移動時保留權限和擁有者及群組的方法

使用小寫的 -p 參數來完成這項工作 % cp -p file1 /path/to/file2 如果要複製整個目錄,在