为什么我不能在子字符串中捕获多个数字?

时间:2017-07-12 13:49:57

标签: regex pcre named-captures

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

My Regex Demo

模式:

/(?=[^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只提取一个数字。

2 个答案:

答案 0 :(得分: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+)
 ^^^                                           ^  ^                      ^

请参阅this regex demo

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

答案 1 :(得分:0)

另外,当你有一个长模式时,请不要犹豫,使用x修饰符(对于&#34;自由间距&#34;模式),最后使用引用功能{{ 1}} (用于计算空格和特殊字符而不转义它们)以使其更具可读性:

\Q..\E

demo