`
JAVA天地
  • 浏览: 673416 次
  • 性别: Icon_minigender_1
  • 来自: 太原
文章分类
社区版块
存档分类
最新评论

使用Regex实现的为JFileChooser使用的FileFilter对象的创建类

阅读更多

貼地址:http://blog.csdn.net/unagain/archive/2006/03/20/630233.aspx?Pending=true

在使用swing的程序中经常用到JFileChooser,并且经常需要自定义一个FileFilter的子类来在文件列表中屏蔽不需要的文件。

大多数情况下,该子类是这样设计的:

public ImgFileFilter

extends FileFilter{

public boolean accept(File f) {

if (f.isDirectory()) {

return true;

}

// Utils is a user custom utility class, getExtension

// is used to return the extension of a file.

String extension = Utils.getExtension(f);

if (extension != null) {

if (extension.equals(Utils.tiff) ||

extension.equals(Utils.tif) ||

extension.equals(Utils.gif) ||

extension.equals(Utils.jpeg) ||

extension.equals(Utils.jpg) ||

extension.equals(Utils.png)) {

return true;

} else {

return false;

}

}

return false;

}

public boolean getDescription(){

return "Image Files.";

}

}

这段代码取自sun公司的"Java Tutorial". 正象你所看到的accept(File file)方法决定一个文件是否显示如果返回值为true则显示反之屏蔽。

麻烦的是如果你要使用多项文件类型选择,比如在EditPluse里,你可以选择打开*.txt, *.cpp, *.java等文件。为了这类需求,你不得不一个一个为不同的文件选择设计不同的FileFilter。有没有更方便的方法来实现FileFilter呢?我设计了一个工具类可以解决这个问题,使用它,几行代码就可以完成一个JFileChooser的设计:

JFileChooser chooser = new JFileChooser();

FileFilterBuilder builder = FileFilterBuilder.newInstance().

chooser.setFileFilter(

builder.createFileFilter(

"*.tiff;*.tif;*.gif;*.jpeg;*.jpg;*.png"

,"Image Files(*.tiff;*.tif;*.gif;*.jpeg;*.jpg;*.png)"));

chooser.setFileFilter(

builder.createFileFilter(

"*.cpp;*.h",

"Cpp Files(*.cpp;*.h)"));

chooser.setFileFilter(

builder.createFileFilter(

"exam*.cpp;exam?.h",

"example Files(*.cpp;*.h)"));

chooser.showOpenDialog(null);

仅仅是这几行代码就实现了第一个程序的功能,另外,还增加了一个选择cpp文件的功能和一个选择以exam开头的cpp文件或以exam开头的后跟一个字符的.h文件。下面,我将把我的设计介绍个大家。

jsdk1.4开始,在java.util.regex出现了一个新的javaPatternPattern是一个编译了的正则表达式的。它有很强大的功能,在这里我只使用其中一点点。在Pattern类中有一个方法matches(String regex, CharSequence input)可以判断是否一个input可以与一个regex向符合。"regex""regular expression"的缩写, 一个正则表达式是一个字符串模型, Windows中文件名模型一样, 比如, "*.exe" 就是一个可以包括所有可执行文件的文件名模型。

到这里,你会猜到我要做什么了。首先,我介绍几个程序中用到的regex的特征。

在一个regex中,字符"."代表任何一个字符,".*"代表零个或多个字符,".{n}"代表n个任意字符。我们可以作一个测试。

import java.util.regex.Pattern;

public class TestRegex {

public static void main(String[] args) {

String regex, input;

regex = args[0];

input = args[1];

boolean isMatch = Pattern.matches(regex, input);

System.out.println(isMatch);

}

}

上面代码中args[0]是一个你提供的regexargs[1]是一个待判定的字符串如果该字符串与regex相符程序将打印True否则false。通过提供不同的运行参数并查看运行结果,可以帮助你了解regex

我们知道,在windows文件名模型中"?"代表一个字符,与regex中的".{1}"相对应;"*"代表0个或多个字符,与regex中的".*"相对应。如果一个字符串中包含"????",那么,对应的,我们可以在regex中使用".{4}"与之匹配。最后一个重要的事情是对于字符"."regex应该使用"[.]"与之对应。

好了,事情结束了,正象你所猜测的,我的设计的核心是把windows的文件名模型转换成regex,然后使用这个regex来决定那些文件可以显示,那些文件不显示。下面列出所有代码。

/*

* @(#)FileFilterBuilder.java 1.0 06/01/03

*

*/

package je14tut.dom;

import java.io.File;

import java.util.regex.Pattern;

import javax.swing.filechooser.FileFilter;

/**

* The <code>FileFilterBuilder</code> class is a singleton, it can create

* a appropriate <code>FilterFilter</code> object for a <code>JFileChooser</code> object

* in your code, rather than to write a subclass of FileFilter manually.

* <p>

* You can use <code>newInstance</code> to obtain the only instance, and use

* <code>createFileFilter</code> to get the <code>FileFilter</code>.

*

* @author Jason

*

*/

public class FileFilterBuilder {

static FileFilterBuilder INSTANCE;

static final int NAME = 0;

static final int EXT = 1;

private FileFilterBuilder() {}

/**

* create and get the singleton instance.

* @return FileterBuilder.

*/

public static FileFilterBuilder newInstance() {

if (INSTANCE == null) {

INSTANCE = new FileFilterBuilder();

}

return INSTANCE;

}

/**

* The only functional method in this class so far, used to create a appropriate

* <code>FileFilter</code> instance you perferred based on a windows system file pattern

* you given.

*

* @param winFilePattern - A window system file pattern, such as "*.java", "new*.*",

* "ex?mp*.exe", etc.

* <blockquote>you can specified two or more pattern once, split each other with ";", for example

* "*.java;*.html", etc. </blockquote>

* @param description

* @return

*/

public FileFilter createFileFilter(String winFilePattern, final String description) {

final String pattern = PatternBuilder.createFileRegex(winFilePattern);

FileFilter filter =

new FileFilter() {

public boolean accept(File f) {

if (f.isDirectory()) {

return true;

}

return Pattern.matches(pattern, f.getName().toLowerCase());

}

public String getDescription() {

return description;

}

};

return filter;

}

}

/**

* <code>PatternBuilder</code> has only one methoes so far, it just as a translator to convert a

* windows system file pattern to a java regular expression for <code>FileFilterBuiolder</code>.

* In fact it is more power than FileFilter needed, for Considering possibly usage in future, I

* separate it from <code>FileFilterBuiolder</code>.

* @author Jason

*/

class PatternBuilder {

private PatternBuilder() {}

public static String createFileRegex(String filePattern) {

StringBuffer regex = new StringBuffer();

boolean lastIsQueMark = false;

int queMarkCount = 0;

filePattern = filePattern.toLowerCase();

for (int i=0; i<filePattern.length(); i++) {

font-size: 10pt; color: black; font-f

分享到:
评论

相关推荐

    C++正则表达式-regex类(不依赖其他库)

    在这个特定的案例中,我们关注的是`regex`类,它是C++ `&lt;regex&gt;`库的一部分,用于实现正则表达式操作。这个压缩包文件包含了一个名为`regex.h`的头文件,以及`release`和`debug`两个目录,这通常意味着它提供了编译...

    C语言在Visual Studio 2010环境下使用regex.h正则表达式函数库

    在Visual Studio 2010环境下,我们可以使用`regex.h`头文件来引入PCRE(Perl Compatible Regular Expressions)库,从而实现正则表达式的匹配和操作。以下是对这个主题的详细讲解: 1. **PCRE库介绍** PCRE是一个...

    regex.h regex.cpp

    在C++环境中,可能会利用C++的类和对象来封装这些C风格的函数,提供更加面向对象的接口,使得使用正则表达式更加方便和直观。 在标签"regex"中,我们也可以理解为这是关于正则表达式操作的代码示例或库。正则表达式...

    C#正则表达式Regex类的用法

    在C#中使用正则表达式首先需要引入`System.Text.RegularExpressions`命名空间,然后通过`Regex`类的各种方法来实现具体的文本处理功能。 #### 四、Regex类常用方法 1. **静态Match方法**:用于获取输入字符串中第...

    RegEX Tester下载及使用

    在使用RegEX Tester时,首先需要了解的是正则表达式的语法。正则表达式由一系列特殊字符和普通字符组成,这些字符组合在一起定义了一个模式,用于匹配字符串。例如,"."代表任意单个字符,"\d"代表数字,"*"表示前面...

    TestRegex_regex_C#_

    1. **创建正则表达式对象**:通常,我们需要先创建一个 `Regex` 对象,传入一个表示正则模式的字符串。例如: ```csharp Regex regex = new Regex(@"\d{3}-\d{2}-\d{4}"); ``` 这个正则模式匹配格式为 "XXX-XX-...

    正则表达式(regex)C语言源码,超强查找/替换算法

    在C语言中,实现正则表达式功能通常需要借助第三方库,比如本案例中提到的Henry Spencer的regex library。这个库提供了在C语言环境中使用正则表达式的功能,具有高度可移植性和简洁的API。 **1. Henry Spencer的...

    Linux下regex移植,Linux和windows可通用

    而在Windows系统中,可以使用Microsoft特定的`&lt;regex&gt;`库,它基于C++标准模板库(STL),提供了`std::regex`类和相关的成员函数。 **1. POSIX与C++标准库的regex** 在Linux下,我们习惯于使用POSIX的regex函数,如...

    C++Boost的Regex库用法

    在使用Boost Regex库时,首先需要包含相应的头文件`&lt;boost/regex.hpp&gt;`,然后可以使用命名空间`boost`下的类和函数。库中的`boost::regex`类是核心,它代表正则表达式的类型,可以用来编译正则表达式并进行匹配。`...

    linux下的C语言POSIX正则表达式头文件和源文件: regex.h regex.cpp

    在Windows环境中,如VS2010或2012,虽然默认不支持POSIX标准,但通过引入`&lt;regex.h&gt;`头文件并适当地配置项目设置,可以在Windows上编译和使用这些POSIX函数。需要注意的是,Windows系统中的正则表达式库通常使用不同...

    Cpp regex usge demo

    在C++中,`std::regex`是一个基本的正则表达式对象,你可以通过构造函数传递一个字符串来创建它,该字符串表示你要匹配的模式。例如,如果你想匹配所有数字,可以这样做: ```cpp std::regex numberRegex("\\d+"); ...

    用于windows的posix regex C库

    总的来说,这个库为Windows开发者提供了在C语言环境中使用POSIX正则表达式的能力,从而扩展了Windows编程的灵活性,使得开发者可以充分利用正则表达式的强大功能,进行文本处理、数据提取、输入验证等工作。...

    C/C++ Regex/Regular Expression(C/C++正则表达式库实现)

    1. **正则表达式构造**:创建一个`std::regex`对象,需要提供一个字符串作为正则表达式模式。例如,`std::regex pattern("^[a-zA-Z]+$");`表示只匹配由字母组成的字符串。 2. **匹配操作**: - `std::regex_match`...

    C# Regex 的几种写法 文档

    - 预编译的正则表达式可以通过创建`Regex`对象时指定`RegexOptions.Compiled`选项实现。 4. **线程安全**: - `Regex`类是线程安全的,这意味着多线程环境下可以同时使用同一个`Regex`实例,不会出现数据竞争问题...

    regex++ document (boost)

    2. 编译与匹配:`regex++`库提供了编译正则表达式字符串为对象的功能,然后通过这个对象进行匹配操作。例如,`boost::regex re("pattern")`编译正则,`boost::regex_match(str, re)`检查字符串是否匹配。 三、`...

    正则表达式测试工具regex101

    - **分组与引用**:使用括号`()`创建分组,可以通过`\数字`引用前面的分组。 - **选择与否定**:`|`表示或操作,`[^字符集]`表示否定字符集,匹配不在集合内的字符。 通过熟练掌握这些基本概念和`regex101`工具的...

    C++Regex正则表达式

    1. **编译模式**:使用 `std::regex` 构造函数将正则表达式模式编译为正则对象。 ```cpp std::regex reg("模式"); ``` 2. **匹配与迭代**:通过 `std::regex_match` 或 `std::regex_search` 进行全匹配或部分匹配...

    GNU regex windows编译

    这个压缩包文件似乎包含了一个针对Windows环境的GNU regex编译版本,名为"regex2dll",它可能是一个动态链接库(DLL),方便开发者在Windows平台上集成到自己的项目中使用。 在Windows上编译GNU regex库通常涉及到...

    java 正则表达式应用jar包 regex-smart.jar

    2. **Matcher类**:使用Pattern对象,我们可以创建Matcher实例,它提供了实际的匹配和查找操作。Matcher可以对输入字符串进行扫描,找出符合模式的所有部分。例如: ```java Matcher matcher = pattern.matcher(...

    regex test.zip_regex

    - 使用`std::basic_regex`构造器创建`std::regex`对象,传入正则表达式字符串和匹配模式。匹配模式可以是`std::regex_constants::ECMAScript`(默认),`std::regex_constants::extended`等。 3. **匹配操作**: ...

Global site tag (gtag.js) - Google Analytics