用正規表示式獲取檔名和路徑

2021-09-08 16:52:02 字數 1077 閱讀 4529

乙個檔案中包括檔案的路徑和檔名,用正規表示式來分割路徑和檔名

$wholepath = "/usr/lib/file.txt";

$leadpath = "";

$filename = "";

if ($wholepath =~ m!^(.*)/([^/]*)$!) else

print "leadpath: ".$leadpath."\n";

print "filename: ".$filename."\n"

效果為:

leadpath: /usr/lib

filename: file.txt

使用語言:perl

這裡用了兩個括號來匹配路徑和檔名,perl是使用的傳統的nfa(非確定有限自動機),講一下原理;

nfa使用是深度搜尋回溯的方法,所以在寫正規表示式的時候,需要考慮的正規表示式的效率問題,

如前面的例子:

!^(.*)/([^/]*)$!         ——這裡使用嘆號「!」是因為裡面有斜槓"/"

在nfa中如: 「 .* 」 這樣的式子,有用點號"."可以匹配任意字元,所以兩個字元的組合第一次直接把字串給匹配完了

接著後面出現了乙個斜槓,但此時已經匹配到末尾了, 所以匹配會回溯,直到第乙個斜槓,然後這裡匹配成功,接著

是所有的非斜槓字元,那這當然是檔名了,然後匹配結束。

這裡需要注意幾點:

一,應該使用脫字符號"^"因為匹配重第乙個字元開始,匹配到最後,如果變數$wholepath中沒有斜槓,

匹配會一直回溯到第乙個字元,此時匹配不成功, 然而,因為沒有脫字元,匹配會嘗試重第二個字元

開始匹配,並回溯到第二個字元,然後是第三個....直到最後乙個字元,這只是乙個小的字串,如果

是乙個很長的文字,那麼就會很費時了,所以,寫正則的時候,應考慮到脫字元,這樣加上後,當第一次

回溯到第乙個字元時,就匹配失敗了,這樣時間就快了很多。

二,使用「.*」時,匹配是直接匹配的一行的結束,然後才回溯匹配的,一般來說深度搜尋的效率比較低,所以

應該盡可能的減少多餘的回溯

正規表示式提取URL中的檔名和替換

問題 http community.csdn.net expert topic 4706 4706491.xml?temp 6.908596e 03 在freetexbox中的所以html內容中找到html語言 http localhost 2045 glietnet image news news...

正規表示式 匹配 獲取 所有表名

寫出匹配sql語句中的所有表名,備忘記錄 折磨了好久,正規表示式如下 s from s w w b w r n s 支援各種表示式 select from config select from dbo imeiuser select from dbo.lotterylog select from g...

獲取檔名和路徑函式

delphi 獲取檔名路徑 2011 10 03 9 26 獲取檔名和路徑函式 extractfilename 從檔名中抽取不含路徑的檔名 extractfilepath 從檔名中抽取路徑名 extractfiledir 從檔名中抽取目錄名 extractfileext從檔名中抽取擴充套件命 例子 ...