有一个要求,我被要求想出一个逻辑来删除一组可能的模式的特定日志文件,我能够单独创建它们,但我发现很难创建一种适用于所有这些场景的完整模式。
将“应用程序”视为创建的日志文件名,这些是我应该处理的场景:
- “应用程序.xml”
- “应用程序#number.xml”
- “application.xml.2016-01-10”
运行这些单独的模式,我能够删除想要删除的文件,但我正在寻找一个比使用 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;
}
}
最佳答案
不要使用 3 种不同的模式,而是使用 1 种模式将它们与 |
运算符组合起来。
所以代替:
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 + ")";
关于java - 单一模式以适应使用 Java 的多个正则表达式模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34720777/