1. 程式人生 > >萬用字元與正則表示式的關係

萬用字元與正則表示式的關係

關係

首先,先給出關係。

萬用字元 正則表示式
* (.)*
(.)?
. \.

本人在開發中,時常會把正則和萬用字元搞混,甚至一度以為通配是正則的子集。通配是一種簡單的助記符號,功能單一,而正則更為強大和豐富。並且它們之間沒有太大的聯絡,但是可以把萬用字元轉化為正則表示式。

舉例

這裡主要列舉通配檔案路徑的例子,使用unix路徑分隔符。一般用在檔案路徑的表示上,習慣用萬用字元多一些,而相同功能的萬用字元如果轉化為正則則更顯複雜,可讀性也差一些。
萬用字元
含義
C:/files/*
C:/files目錄下的所有檔案和資料夾
等同於正則:C:/files/(.)* 
C:/files/*.*
C:/files
目錄下的所有檔案(或帶.的資料夾)
等同於正則:C:/files/(.)*\.(.)*
C:/files/*.txt C:/files目錄下的所有txt檔案
等同於正則:C:/files/(.)*\.txt
C:/files/*/ C:/files目錄下的所有子檔案
C:/files/a.txt
C:/files目錄下的a.txt檔案
等同於正則:C:/files/a.txt
C:/files/*/*.txt
C:/files目錄下的所有第一層子資料夾下的所有txt檔案
C:/files/*/*/?.txt
C:/files目錄下的所有第層子資料夾下的檔名長度不超過1的txt檔案
C:/files/test*-with/*/gb/text_*/encoding-?.verify
先找到C:/files下的通配test*-with子資料夾; 在所有test*-with資料夾下找到所有二層子資料夾且名為gb的資料夾; 在gb資料夾下找到通配text_*的子資料夾; 在text_*資料夾中找到通配encoding-?.verify的所有檔案; 返回所有找到的encoding-?.verify檔案。

結語

要在程式中獲得上述的通配檔案的結果,單憑正則表示式實現起來效率不高,特別是稍顯複雜的例子,因為牽涉到子資料夾的遞迴搜尋。為實現複雜的檔案路徑匹配,我在網上找了很多資源,但沒有找到很好的解決方案。無奈之下決定對Apache 的 commons-io包進行擴充套件,實現了初步的解決方案,還未進行程式優化和測試。現託管在http://code.taobao.org/p/commonsio_extend/src/。對開源的協議不是很熟悉,不知道這樣做也沒有違法什麼協議之類的。