Regex 为什么可以';我不能在子字符串中捕获多个数字吗?

Regex 为什么可以';我不能在子字符串中捕获多个数字吗?,regex,pcre,named-captures,Regex,Pcre,Named Captures,我正在创建正则表达式以从日志文件中提取各种字段。我使用一些工具创建了一个正则表达式,它几乎完成了。唯一的问题是对于一个字段,它只提取一个数字而不是完整的数字。为了更好的理解,我把它保存到下面的链接 模式: /(?=[^P]*(?:ParNew|P.*ParNew|PSYoungGen|DefNew))^(?:).*(?P<ParNew_before_1>\d)K\->(?P<ParNew_after_1>\d+)K\((?P<young_heap_size&

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

模式:

/(?=[^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+)/
电流输出:

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\u在\u 1之前
378633


在上面的示例中:Group
ParNew\u before\u 1
只提取一个数字。

我想在这里指出三件事:

  • 前瞻应该放在
    ^
    之后(只在字符串开头检查其模式更有意义)
  • \d
    匹配的数字不会超过1位,请在其后面添加
    +
    ,以匹配1位或更多位
  • *
    太贪婪了,请使用lazy
    *?
使用

^(?=[^P]*(?:ParNew | P.*ParNew | PSYoungGen | DefNew)).*(?P\d+K->(?P\d+K)(?P\d+K)(?P\d+.\d+secs\)(?P\d+K->(?P\d+K)(?P\d+)
^^^                                           ^  ^                      ^


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

当您有长图案时,请不要犹豫使用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
/
^
(?=
[^PD\n]*(?>[PD][^\nPD]*)*?\b
(?:ParNew | PSYoungGen | DefNew)
)
[^\n\d]*(?>\d+[^\n\d]+)*?\b
(?\d+)K->
(?\d+)\QK(\E
(?\d+\QK),\E
(?\d+\.\d+\Q秒]\E
(?\d+)K->
(?\d+)\QK(\E
(?\d+)
/x

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`
^(?=[^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+)
 ^^^                                           ^  ^                      ^
/
^
(?=
    [^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