001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     * 
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     * 
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package org.apache.commons.io.filefilter;
018    
019    import java.io.File;
020    import java.io.Serializable;
021    import java.util.regex.Pattern;
022    
023    import org.apache.commons.io.IOCase;
024    
025    /**
026     * Filters files using supplied regular expression(s).
027     * <p/>
028     * See java.util.regex.Pattern for regex matching rules
029     * <p/>
030     *
031     * <p/>
032     * e.g.
033     * <pre>
034     * File dir = new File(".");
035     * FileFilter fileFilter = new RegexFileFilter("^.*[tT]est(-\\d+)?\\.java$");
036     * File[] files = dir.listFiles(fileFilter);
037     * for (int i = 0; i < files.length; i++) {
038     *   System.out.println(files[i]);
039     * }
040     * </pre>
041     *
042     * @version $Id: RegexFileFilter.java 1304058 2012-03-22 21:02:43Z sebb $
043     * @since 1.4
044     */
045    public class RegexFileFilter extends AbstractFileFilter implements Serializable {
046    
047        /** The regular expression pattern that will be used to match filenames */
048        private final Pattern pattern;
049    
050        /**
051         * Construct a new regular expression filter.
052         *
053         * @param pattern regular string expression to match
054         * @throws IllegalArgumentException if the pattern is null
055         */
056        public RegexFileFilter(String pattern) {
057            if (pattern == null) {
058                throw new IllegalArgumentException("Pattern is missing");
059            }
060    
061            this.pattern = Pattern.compile(pattern);
062        }
063    
064        /**
065         * Construct a new regular expression filter with the specified flags case sensitivity.
066         *
067         * @param pattern regular string expression to match
068         * @param caseSensitivity  how to handle case sensitivity, null means case-sensitive
069         * @throws IllegalArgumentException if the pattern is null
070         */
071        public RegexFileFilter(String pattern, IOCase caseSensitivity) {
072            if (pattern == null) {
073                throw new IllegalArgumentException("Pattern is missing");
074            }
075            int flags = 0;
076            if (caseSensitivity != null && !caseSensitivity.isCaseSensitive()) {
077                flags = Pattern.CASE_INSENSITIVE;
078            }
079            this.pattern = Pattern.compile(pattern, flags);
080        }
081    
082        /**
083         * Construct a new regular expression filter with the specified flags.
084         *
085         * @param pattern regular string expression to match
086         * @param flags pattern flags - e.g. {@link Pattern#CASE_INSENSITIVE}
087         * @throws IllegalArgumentException if the pattern is null
088         */
089        public RegexFileFilter(String pattern, int flags) {
090            if (pattern == null) {
091                throw new IllegalArgumentException("Pattern is missing");
092            }
093            this.pattern = Pattern.compile(pattern, flags);
094        }
095    
096        /**
097         * Construct a new regular expression filter for a compiled regular expression
098         *
099         * @param pattern regular expression to match
100         * @throws IllegalArgumentException if the pattern is null
101         */
102        public RegexFileFilter(Pattern pattern) {
103            if (pattern == null) {
104                throw new IllegalArgumentException("Pattern is missing");
105            }
106    
107            this.pattern = pattern;
108        }
109    
110        /**
111         * Checks to see if the filename matches one of the regular expressions.
112         *
113         * @param dir   the file directory (ignored)
114         * @param name  the filename
115         * @return true if the filename matches one of the regular expressions
116         */
117        @Override
118        public boolean accept(File dir, String name) {
119            return pattern.matcher(name).matches();
120        }
121    
122    }