萬用字元與正則表示式的關係
阿新 • • 發佈:2019-01-29
關係
首先,先給出關係。
萬用字元 | 正則表示式 |
* | (.)* |
? | (.)? |
. | \. |
本人在開發中,時常會把正則和萬用字元搞混,甚至一度以為通配是正則的子集。通配是一種簡單的助記符號,功能單一,而正則更為強大和豐富。並且它們之間沒有太大的聯絡,但是可以把萬用字元轉化為正則表示式。
舉例
這裡主要列舉通配檔案路徑的例子,使用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/。對開源的協議不是很熟悉,不知道這樣做也沒有違法什麼協議之類的。