我正在尝试解析一些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:
时间
这两种格式是我需要解析的主要格式。
答案 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