使用Java

时间:2016-01-11 11:46:27

标签: java regex

有一个要求在哪里,我被要求提出一个逻辑来删除一组具有可能的模式的日志文件,我可以单独创建它们但我发现很难创建一个完整的模式,适应所有这些场景。

将“application”视为创建的日志文件名,这些是我应该处理的场景:

  1. “application.xml中”
  2. “应用程序#number.xml”
  3. “application.xml.2016-01-10”
  4. 运行这些单独的模式,我能够删除目标文件,但我正在寻找比3个单独模式更好的版本。任何帮助或输入都非常感谢!

    代码段:

    public class PatternMatchPOC {
        public static void main(String[] args) {
            File logsDirectoryPath = new File("C:\\POCLogs");
            FileFilter patternFilter = getFilter();
            File[] list = logsDirectoryPath.listFiles(patternFilter);
            if (list.length > 0) {
                for (int i = 0; i < list.length; i++) {
                    System.out.println("File" + i + " : " + list[i].getName());
                }
            } else {
                System.out.println("ERROR: No files available matching the pattern");
            }
        }
    
        public static FileFilter getFilter() {
            FileFilter patternFilter = new FileFilter() {
    
                Pattern p1 = Pattern.compile("application" + "\\.xml");
                Pattern p2 = Pattern.compile("application" + "\\.xml.\\d{4}-\\d{2}-\\d{2}");
                Pattern p3 = Pattern.compile("application" + "#..xml");
    
                @Override
                public boolean accept(final File file) {
                    boolean first = p1.matcher(file.getName()).matches();
                    boolean second = p2.matcher(file.getName()).matches();
                    boolean third = p3.matcher(file.getName()).matches();
    
                    return first | second | third;
                }
            };
            return patternFilter;
        }
    }
    

2 个答案:

答案 0 :(得分:2)

使用1个模式与|运算符组合,而不是3种不同的模式。

所以而不是:

Pattern p1 = Pattern.compile("application" + "\\.xml");
Pattern p2 = Pattern.compile("application" + "\\.xml.\\d{4}-\\d{2}-\\d{2}");
Pattern p3 = Pattern.compile("application" + "#..xml");

使用以下

String p1 = "application" + "\\.xml";
String p2 = "application" + "\\.xml.\\d{4}-\\d{2}-\\d{2}";
String p3 = "application" + "#..xml";

Pattern p = "(" + p1 + ")|(" + p2 + ")|(" + p3 + ")";

答案 1 :(得分:1)

如果您没有动态构建模式,可以使用可选组

application(?:#[^.]*)?\\.xml(?:\\.\\d{4}-\\d{2}-\\d{2})?

请参阅regex demo

说明:

  • application - 文字字符串application
  • (?:#[^.]*)? - 一个或零(=可选)#后跟零个或多个字符而不是句号
  • \\.xml - 文字.xml
  • (?:\\.\\d{4}-\\d{2}-\\d{2})? - 一个点的一个或零(=可选)序列,后跟4个数字,后跟2个-后跟2个数字的序列

您在Java中更新的代码如下所示:

 public static FileFilter getFilter() {
    Pattern p = Pattern.compile("application(?:#[^.]*)?\\.xml(?:\\.\\d{4}-\\d{2}-\\d{2})?");
    FileFilter patternFilter = new FileFilter() {
        @Override
        public boolean accept(final File file) {
           return p.matcher(file.getName()).matches();
        };
        return patternFilter;
    }
}