有一个要求在哪里,我被要求提出一个逻辑来删除一组具有可能的模式的日志文件,我可以单独创建它们但我发现很难创建一个完整的模式,适应所有这些场景。
将“application”视为创建的日志文件名,这些是我应该处理的场景:
运行这些单独的模式,我能够删除目标文件,但我正在寻找比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;
}
}
答案 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;
}
}