1

我正在创建正则表达式以从日志文件中提取各种字段。我使用一些工具创建了一个正则表达式,它几乎完成了。唯一的问题是对于一个字段,它只提取一位数字而不是完整数字。为了更好地理解,我已将其保存到以下链接。

我的正则表达式演示

图案:

/(?=[^P]*(?:ParNew|P.*ParNew|PSYoungGen|DefNew))^(?:).*(?P<ParNew_before_1>\d)K\->(?P<ParNew_after_1>\d+)K\((?P<young_heap_size>\d+)K\), (?P<par_new_duration>\d+\.\d+) secs\] (?P<ParNew_before_2>\d+)K\->(?P<ParNew_after_2>\d+)K\((?P<total_heap_size>\d+)/

细绳:

146372.273: [GC146372.274: [ParNew: 378633K->88155K(419456K), 0.0313803 secs] 9893391K->9602913K(12478080K), 0.0320299 secs] [Times: user=0.32 sys=0.01, real=0.03 secs]

电流输出:

Full match      `146372.273: [GC146372.274: [ParNew: 378633K->88155K(419456K), 0.0313803 secs] 9893391K->9602913K(12478080`
Group `ParNew_before_1`     `3`
Group `ParNew_after_1`      `88155`
Group `young_heap_size`     `419456`
Group `par_new_duration`    `0.0313803`
Group `ParNew_before_2`     `9893391`
Group `ParNew_after_2`      `9602913`
Group `total_heap_size`     `12478080`

预期输出:

Full match      `146372.273: [GC146372.274: [ParNew: 378633K->88155K(419456K), 0.0313803 secs] 9893391K->9602913K(12478080`

团体ParNew_before_1 378633

Group `ParNew_after_1`      `88155`
Group `young_heap_size`     `419456`
Group `par_new_duration`    `0.0313803`
Group `ParNew_before_2`     `9893391`
Group `ParNew_after_2`      `9602913`
Group `total_heap_size`     `12478080`

在上面的示例中:ParNew_before_1 仅提取一位数字的组。

4

2 回答 2

2

这里我要注意三点:

  • 前瞻应该放在后面^(只在字符串的开头检查它的模式会更有意义)
  • \d不会匹配超过 1 个数字,在其后添加以+匹配 1 个或更多
  • .*太贪心,用懒惰.*?

利用

^(?=[^P]*(?:ParNew|P.*ParNew|PSYoungGen|DefNew)).*?(?P<ParNew_before_1>\d+)K->(?P<ParNew_after_1>\d+)K\((?P<young_heap_size>\d+)K\), (?P<par_new_duration>\d+\.\d+) secs\] (?P<ParNew_before_2>\d+)K\->(?P<ParNew_after_2>\d+)K\((?P<total_heap_size>\d+)
 ^^^                                           ^  ^                      ^

看到这个正则表达式演示

此外,您不需要转义-不在字符类中的字符。

于 2017-07-12T13:52:50.273 回答
0

顺便说一句,当你有一个长模式时,不要犹豫使用 x 修饰符(用于“自由间距”模式)和最终的引用功能\Q..\E (在不转义的情况下计算空格和特殊字符)以使其更具可读性:

/
^
(?=
    [^PD\n]* (?>[PD][^\nPD]*)*? \b
    (?: ParNew | PSYoungGen | DefNew )
)
[^\n\d]* (?>\d+[^\n\d]+)*? \b
(?<ParNew_before_1>  \d+      ) K->
(?<ParNew_after_1>   \d+      ) \QK(\E
(?<young_heap_size>  \d+      ) \QK), \E
(?<par_new_duration> \d+\.\d+ ) \Q secs] \E
(?<ParNew_before_2>  \d+      ) K->
(?<ParNew_after_2>   \d+      ) \QK(\E
(?<total_heap_size>  \d+      )
/x

演示

于 2017-07-12T19:05:26.013 回答