我正在解析IBM JVM线程转储以提取各种信息。在当前上下文中,线程正在等待的锁定ID,以及拥有该锁定的线程的id。锁定ID在所有转储中都是一致的,它采用十六进制值0x000000000B0D9A20
的形式。但是线程持有锁的id采用不同的值,例如与锁定ID相同的形式的hex id或类似<unknown>
或<unowned>
的值。这是锁主人的身份证,我发现很难提取。
IBM线程转储使用三个子句指定锁定信息(如第一个屏幕截图所示):
Waiting on...
Blocked on...
Parked on...
我正在对正则表达式中的这些子句执行OR运算。
我写了一个接受
的通用方法例如,method1(threadDumpLine,regex,2)
号召唤regex
会在threadDumpLine
上应用[group1,group2]
,并返回group1
列表group2
,其中<unknown>
是在{{1}时捕获的第一个群组是第二个。
第一组需要是锁定ID,我能够捕获,但第二组可以是十六进制ID或<unowned>
或<unowned>
。我能够将锁拥有者的ID作为第二组捕获,但是当它是<unknown>
或<text>
时,它结果是第3组:
(上面regex101)
这种情况正在发生,因为我定义了两个独立的组来捕获锁拥有者的id和{{1}}。所以我尝试将两者结合在一起如下:
(上面regex101)
如何以尽可能少的步骤更改上面指定的正则表达式?
答案 0 :(得分:0)
您可以使用此基于否定的正则表达式来获取正确捕获的组#2:
(?:Blocked on|Parked on|Waiting on):[^@]*@(0x[0-9A-F]+) Owned by:[^<\n]*(0x[0-9]+|[^>\n]+)
这将提供以下匹配数据:
MATCH 1
1. [69-87] `0x000000000B0D9A20`
2. [185-186] `)`
MATCH 2
1. [288-306] `0x000000000296F1E8`
2. [317-325] `<unknown`
MATCH 3
1. [466-484] `0x0000000030A0C590`
2. [495-503] `<unowned`
答案 1 :(得分:0)
试试这个:
<Button Content="Blah Blah Blah"
Click="Click_Handler"
Tag="{StaticResource imageTWO}"
Style="{StaticResource SpecialButtonStyle}"/>
输出:
(?:Blocked on|Parked on|Waiting on):[^@]*@(0x[0-9A-F]+) Owned by:[^<\n]*?(0x[0-9A-F]+|<.*?>)