乙個檔案中包括檔案的路徑和檔名,用正規表示式來分割路徑和檔名
$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從檔名中抽取擴充套件命 例子 ...