正则表达式:用括号分割忽略嵌套括号

时间:2015-06-22 18:10:23

标签: java regex parsing logging garbage-collection

我正在尝试解析一些Java GC日志,但我遇到了一些问题。

格式如下:

[GC x.xxx: [ParNew: ...K->...K(...K), y.yyyyyy secs] ...->...K(...), z.zzzzzz secs]

我需要得到y.yyyyyy秒和z.zzzzzz。格式并不总是这样。我几乎需要GC时间和ParNew时间,它们总是在各自括号的末尾。 (ParNew括号嵌套在GC括号内,有时甚至有更多嵌套括号)

我找到了一些嵌套括号而不是括号的RegEx,但我无法将其转换为括号。

这里是括号的RegEx:

(?<=\()(?:[^()]+|\([^)]+\))+

任何帮助都将不胜感激。

感谢。

修改

这是另一种格式:

2015-06-18T16:12:52.546-0400: 230.643: 
[Full GC 230.643: [CMS2015-06-18T16:13:01.671-0400: 239.767: [CMS-
concurrent-mark: 9.342/9.342 secs] 
[Times: user=9.41 sys=0.02, real=9.34 secs (concurrent mode failure):
 5392703K->5392703K(5392704K), 26.8121270 secs] 6179135K-
>6073557K(6179136K), [CMS Perm : 32344K->32344K(262144K)], 26.8122780 secs] 
[Times: user=25.86 sys=0.03, real=26.81 secs] 

我需要[CMS2015-06-18...括号的时间26.8121270 secs

编辑2

以下是ParNew格式的实际示例:

2015-06-18T16:09:03.284-0400: 1.381: [GC 1.381: [ParNew: 674112K-
>112320K(786432K), 4.5234120 secs] 674112K->541274K(6179136K), 
4.5235390 secs] [Times: user=12.53 sys=0.77, real=4.52 secs] 

我需要4.5235390 secs

ParNew:时间

这两种格式是我需要解析的主要格式。

3 个答案:

答案 0 :(得分:1)

这实际上取决于你的其他括号的位置。

我做了这个,假设更多括号可以嵌套在ParNew:括号

(?<=\[GC)(?:.*)(?:\[ParNew.*?)(?:(?:\[.*\]).*?)*(\d+(?:\.\d+)? secs)\].*?(\d+(?:\.\d+)? secs)

https://regex101.com/r/yZ6cF3/1

我添加了一些带有额外嵌套括号的示例,这些括号也以x.xxx secs结尾,并且未被捕获。

棘手的部分是(?:(?:\[.*\]).*?)*,它添加了选项以包含任意数量的括号但忽略它们。

以下是您的示例(?<=GC)(?:.*)(?:\[(?:ParNew|CMS20.*?):.*?)(?:(?:\[.*\]).*?)*(\d+(?:\.\d+)? secs)\].*?(\d+(?:\.\d+)? secs)(?:\])(?:(?:[.*])*)的演示:https://regex101.com/r/iY9wQ1/2

请注意,我添加了(?:ParNew|CMS20.*?)或您感兴趣的变量的任何其他开头。如果不这样做,则无法保证它会起作用。

答案 1 :(得分:0)

这个正则表达式对我有用:

([0-9]+\.[0-9]+)(?=\W*secs])

Here's an example。在这种情况下,每个号码都将在捕获组中。

这个正则表达式的作用基本上是:

  • 十进制数的捕获组(一个或多个数字,一个文字句点,后跟一个或多个数字)
  • 前瞻:
    • 一个或多个空格
    • 文字sec]

由于你说它并不总是采用这种格式,我认为这意味着数字与'secs'之间的空格可能不同。如果您的意思是其他部分可以更改,请告诉我们,我将提供修改后的正则表达式。

答案 2 :(得分:0)

如果您正在寻找字符串“real”之后的时间,那么这适用于C#(我不是Java人员)

 (?ixs)(?<=real\s{0,}=\s{0,})\d{1,}(\.\d{1,})*? \s{1,}secs

这给了我2个值:9.34和26.81