首页 > 解决方案 > Java正则表达式从日志文件中获取子指标

问题描述

我正在尝试从包含数千行的日志中获取子指标。这些线不相似,所以我需要在获取子度量之前匹配一些值。

一些简化的示例行

1, 2, acceptline,x,111, 100, , , 20, 20, end
1, 2, declineline,x,x, 100, 20, , end
1, 2, 3, acceptline,x,x, 1000, , 40, end

我尝试在我的值匹配(接受行)之后获取第三个逗号分隔列中的数值。

在我的示例中,这些值是 100 和 1000,但它们基本上可以是任何数值

我已经通过以下 java 正则表达式成功地获得了正确的子度量值

^.*acceptline.+?((?<submetric>,.+?){3}),.*

但是在那个正则表达式中,我得到了子度量,<, 100>或者那个数值是什么。现在我需要改进该正则表达式,以便在接受为子度量之前删除那些领先的 ​​<, >。

标签: javaregex

解决方案


您可以使用

\bacceptline(?:,[^,]*){2},\s*(\d+)

如果数字可以是浮点数,请使用\d*\.?\d+而不是\d+.

请参阅正则表达式演示详情

  • \b- 单词边界
  • acceptline- 一个字
  • (?:,[^,]*){2}- 出现两次逗号,然后出现零个或多个非逗号
  • , - 一个逗号
  • \s*- 零个或多个空格
  • (\d+)- 第 1 组:一位或多位数字。

查看Java 演示

String string = "1, 2, acceptline,x,111, 100, , , 20, 20, end\n1, 2, declineline,x,x, 100, 20, , end\n1, 2, 3, acceptline,x,x, 1000, , 40, end";
        
String regex = "\\bacceptline(?:,[^,]*){2},\\s*(\\d+)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(string);
        
while (matcher.find()) {
    System.out.println(matcher.group(1));
}
// => 100 and 1000

推荐阅读