首先需要宣告的是,其實我對正則的應用也不是特別地熟練,只不過是在工作中「被逼無奈」才一步步地對正則有了一些了解。隨著對正則的了解越多,越來越發現正規表示式真的是乙個很強有力的工具,使用正則,很多時候都可以事半功倍。
先來假設乙個工作環境:有乙個包含使用者資訊的檔案,共有一萬行,每行記錄乙個使用者的資訊,格式如下:
username,010-12345678,firstname.lastname,05/21/2007
下面的文章裡,我將以這個假設的工作環境來介紹php中perl相容的正規表示式的查詢和替換。
查詢最常用的查詢是preg_match(),函式說明如下:
int preg_match_all ( string pattern, string subject, array matches [, int flags]
對正規表示式的語法就不多說了,我假設閱讀這篇文章的朋友都有一定的正則基礎。其實正則表達的查詢用處並不是很大,不是太複雜的查詢通過可以通過strstr()函式來現實,而且效率更高一些。使用正則的查詢通常是一些用strstr()無法實現的比較複雜的查詢。例如,我要查詢**號碼的區號是010且lastname是bill的一行記錄,就可以這麼寫
preg_match('/^[^,]*,010[^\.]*\.bill.*$/i',$line);
其中$line的意思是檔案的一行資料。假如$line中的區號是010,lastname又正好是bill,上面的語句就會返回乙個非零的正整數,通常我們並不關心這個數的值,而是只關心是否有匹配。又假如我們想找出lastname是bill的使用者在2023年的記錄,可以用下面的語句
preg_match('/^[^,]*,[^,]*,[^\.]*\.bill,[^\/]*\/[^\/]*\/2007/i',$line);
用到正規表示式的替換的地方通常是在需要匹配兩個或兩個以上的關鍵字,且這兩個關鍵字不相鄰。這個時候無法用正常的查詢函式來實現,就用到正則。
替換:相對於查詢,我認為替換才是正規表示式最強大、最有用的地方。假設我們現在需要把檔案中一萬條記錄的日期格式換成yyyy/mm/dd,你會怎麼做呢?你會發現,普通的查詢替換是達不到這個目的了。也許你會說可以把一行的記錄分解,進行分析後再重組。我承認這確實是乙個解決的辦法,可是這並不是最好的解決辦法,讓我們看一下用正則是怎麼來達到我們的要求的:
$line = preg_replace('/([^,]*,[^,]*,[^,]*,)([0-9]*)\/([0-9]*)\/([0-9]*)/i',"\$\$\$\$",$line);
這裡我們使用了正規表示式裡的「子模式」,細心觀察就可以發現,preg_replace函式的第乙個引數裡一共有四對『()』,每一對『()』裡的內容就是乙個「子模式」,在第二個引數裡可以通過\$、\$這樣的格式來隨便組合這些子模式。如我想刪除資料裡的**號碼,可以這樣來寫:
$line = preg_replace('/([^,]*,)([^,]*,)[^,]*,)([0-9]*)\/([0-9]*)\/([0-9]*)/i',"\$\$\$\$",$line);
這裡為了介紹子模式而使用了比較複雜的寫法,實際上還有一種更簡單的方法:
$line = preg_replace('/,[\d]+\-[\d]+/i','',$line);
有一句話,忘了是別人說的還是自己原創的,反正在我腦子裡好久了:正規表示式不是技術,而是技巧:)正則的入門實際上是相當簡單的,用上一兩次就能掌握基本的語法,要讓這把劍發揮出多大的威力,就看個人的修行了。需要說明的一點是,這把劍實際上也是一把雙刃劍:正則的執行效率實際上要比strstr,strpos之類的函式低,所以,當你的查詢很簡單的時候,就沒必要再合用正則了。
在UltraEdit中使用正規表示式
在ultraedit中使用正規表示式 刪除空行 替換 t p 為 空串 刪除行尾空格 替換 t 為 空串 刪除行首空格 替換 t 為 空串 每行設定為固定的4個空格開頭 替換 t t p 為 1 每段設定為固定的4個空格開頭 替換 t 為 如果一行是以空格開始的,則視之為一段的開始行 將一段合併為一...
在DELPHI中使用正規表示式
在網上發現,有多種方法可在delphi中使用正規表示式。竊以為直接使用微軟的regexp物件會比較簡單,無需額外工作。使用微軟regexp方法 2.註冊vbscript.dll regsvr32 命令,若安裝過vb或ie5以上會預設安裝該dll 3.在delphi中引入 microsoft vbsc...
在UltraEdit中使用正規表示式
刪除空行 替換 t p 為 空串 刪除行尾空格 替換 t 為 空串 刪除行首空格 替換 t 為 空串 每行設定為固定的4個空格開頭 替換 t t p 為 1 每段設定為固定的4個空格開頭 替換 t 為 如果一行是以空格開始的,則視之為一段的開始行 將一段合併為一行 替換 t p t p 為 1 注意...