关系
首先,先给出关系。
通配符 | 正则表达式 |
* | (.)* |
? | (.)? |
. | \. |
本人在开发中,时常会把正则和通配符搞混,甚至一度以为通配是正则的子集。通配是一种简单的助记符号,功能单一,而正则更为强大和丰富。并且它们之间没有太大的联系,但是可以把通配符转化为正则表达式。
举例
通配符 |
含义 |
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 |
返回所有找到的encoding-?.verify文件。
|
结语
要在程序中获得上述的通配文件的结果,单凭正则表达式实现起来效率不高,特别是稍显复杂的例子,因为牵涉到子文件夹的递归搜索。为实现复杂的文件路径匹配,我在网上找了很多资源,但没有找到很好的解决方案。无奈之下决定对Apache 的 commons-io包进行扩展,实现了初步的解决方案,还未进行程序优化和测试。现托管在http://code.taobao.org/p/commonsio_extend/src/。对开源的协议不是很熟悉,不知道这样做也没有违法什么协议之类的。