正则表达式分组和可选匹配

jga*_*ier 5 java regex garbage-collection

首先:我不擅长正则表达式。现在,这是在桌子上。我正在构建一个使用组和可选组件的正则表达式。我遇到的问题是,我需要在两个不同的区域匹配某个数字,并为它们提供相同的组名。这似乎不起作用。

所以具体细节。我正在分析来自 JVM 的垃圾收集日志。有问题的两行是完整的 GC 和常规的 GC。

我把它们分解成可读的。

全线:

229980.058: [Full GC 229980.058: 
            [CMS: 2796543K->2796543K(2796544K), **13.3050667** secs]
            2983863K->2872464K(4067264K), 
            [CMS Perm : 325367K->325242K(1048576K)], 13.3054416 secs] 
            [Times: user=13.27 sys=0.03, real=13.31 secs] 
Run Code Online (Sandbox Code Playgroud)

常规线路:

2.752: [GC 2.752: 
       [ParNew: 1143680K->4938K(1270720K), **0.0243534** secs] 
       1143686K->4945K(4067264K), 0.0245283 secs] 
       [Times: user=0.05 sys=0.02, real=0.03 secs] 
Run Code Online (Sandbox Code Playgroud)

如您所见,Full GC 将 CMS/tenured generation 作为第一个字段区域。第二个没有这些,因为它只是常规收藏。

为了捕获这些,更正的是我已经将“CMS:”和“ParNew:”部分设为彼此可选。但是,我想将每个时间作为一个组名。(我把 ** 放在周围的值)

我正在使用这个正则表达式:

\d+.\d+: [(Full\s)?GC\s\d+.\d+: [(CMS:\s(?<JVM_TenuredGenHeapUsedBeforeGC>\d+)+K->(?<JVM_TenuredHeapUsedAfterGC>\d+)K( \d+K),\s(?<JVM_GCTimeTaken>\d+.\d+)\ssecs)? (ParNew:\s(?\d+)+K->(?<JVM_NewGenHeapUsedAfterGC>\d+)K((?<JVM_NewGenHeapSize>\d+)K),\s(?<JVM_GCTimeTaken>\d+.\d+)\ssecs )?] .. [为简洁起见编辑]

简而言之.. 是否可以在不同的可选匹配项上使用相同的组名?他们永远不会在同一条线上,所以我不知道为什么我不能拉这个。

用 regexr 测试这个似乎也失败了。谢谢!

maa*_*nus 3

我遇到的问题是,我需要在两个不同的区域匹配某个数字,并给它们相同的组名称。

我想说这就是问题所在。我还没有尝试过这个,但我看到更改列表引入了命名组,而这只是命名一个编号组。所以这是行不通的。

给他们不同的名字并使用类似的东西

Objects.firstNonNull(m.group("foo"), m.group("bar"))
Run Code Online (Sandbox Code Playgroud)

如果您确定其中至少有一个非空(否则您会得到 NPE)。或者编写您自己的接受 null 的单行代码。