Java咖啡馆(9)――一个压缩归档实用软件(二)

2014-11-23 21:39:55 · 作者: · 浏览: 10
(Gang of Four)编写的《Design Patterns》一书。值得一提的是,我们上一回编写的名字解析器就是运用了其中的Factory模式,结构非常漂亮。

  顺便说一句,现在支持设计模式的工具也越来越多 ,如果你想有朝一日从Java程序员升级为呼风唤雨的Java构架师,这可是一门必修课哦!

  4.正则表达式(Regular Expression)

  说起正则表达式,即使不熟悉,你也会觉得非常眼熟。没错,现在的文本编辑软件,无论是UltraEdit还是EditPlus,无一不支持正则表达式。可以说,不支持正则表达式的编辑器肯定是三流货色啦。

  理论上,正则表达式等价于有限自动机,能够表达相当丰富的语言,DOS中通配符的能力是无法望其项背的。学过编译原理或者计算机理论的朋友一定很熟悉了,可是,如果从头开讲,恐怕这期所有版面都不够。因此这里推荐你参考Sun免费的Java Tutorial中的Regular Expressions一章,写得很详细。即使你熟悉计算机理论的正则表达式,也建议抽空看一看,因为Java采取的是类Perl风格的语法,和理论书上有些出入。

  比如我们要过滤出所有Java源程序。众所周知,Java文件名必须以字母、美元符号或者下划线开头,然后可以由数字、字母、美元符号或者下划线的任意组合,最后扩展名是java。用正则表达式写出来,就是“[a-zA-Z_$][a-zA-Z_$0-9]*.java”(不含引号)。

  其中,[a-zA-Z_$]表示小写字母a至z、大写字母A至Z、美元符号或者下划线任取其一;[a-zA-Z_$0-9]*表示小写字母a至z、大写字母A至Z、美元符号、下划线以及0至9这十个数字的任意组合;“.java”表示Java源程序的扩展名,由于“.”在Java正则表达式中有特殊意义,所以“.”才表示一个“.”符号。

  当然,Java正则表达式API中还有许多扩充,可以简写为:[a-zA-Z_$][w$]*.java。

  有了这些知识,我们不难写出支持正则表达式的文件过滤器FileFilter,源代码如下:

public class FileFilter implements FilenameFilter {
private Pattern pattern;

public FileFilter(String regex) {
pattern = Pattern.compile(regex);
}

public boolean accept(File dir, String name) {
File file = new File(dir + "\" + name);
return pattern.matcher(file.getName()).matches() && file.isFile();
}

}

  Java中通过Pattern类来使用正则表达式。在FileFilter的构造函数中,通过把regex参数传递给Pattern的compi