如何使用正则表达式Java查找给定日志文件txt格式中的匹配项?

问题描述

我正在尝试创建一个Java项目,其中我将使用数据条目的日志文件(txt文件)和一个正则表达式文件(也是txt并包含RE规则)。 我的目标是获取每个规则(RE)并通过日志文件运行它并找到匹配项,最终目标是打印我找到的匹配项数量。该代码应该是通用的,这意味着我不在乎正则表达式是什么,我只是一个需要2个参数,正则表达式和日志文件中的字符串行的函数。我发现我可以使用正则表达式类(使用模式和匹配器类)。 所以我的程序由2个嵌套的for循环组成,步骤如下: 1-存储来自规则文件的第一个正则表达式。 2-使用pattern和matcher类将规则与日志文件中的每一行进行比较。 3-如果找到匹配项,我将增加一个计数器。 nb:除了嵌套循环。我的问题是,例如,规则是“ notifications”,日志行是“ [INFO] 2020-05-28 09:13:38.965 notifications [main] [CommonEventsManager.initialize]-模块[Common]的初始化成功。 ..”我应该得到一个匹配,但结果是错误的。 这是我用来匹配的代码

  • 模式p = Pattern.compile(“ notifications”);
  • 匹配器m = p.matcher(“ [INFO] 2020-05-28 09:13:38.965通知[main]- [CommonEventsManager.initialize]-模块[Common]的初始化成功...“); -System.out.println(“ dsds” + m.matches());

所以我如何使用正则表达式查找匹配项而不必担心正则表达式格式

解决方法

由于Matcher::matches()仅在正则表达式匹配整个字符串时才返回true,因此您没有匹配项。

为了实现您所描述的内容,您有几种选择。对于Java 8(或更早版本),如果要使用模式:

Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(logFileContent);
int count = 0;
while (m.find()) {
    count++;
}

对于Java 9+,如果要使用模式:

Pattern p = Pattern.compile(regex);
long count = p.matcher(logFileContent).results().count();

如果您想使其更短一些,可以使用(有些人会说是滥用)String::split()

int count = logFileContent.split(regex).length - 1;