在正则表达式中将两个组合并为一个

时间:2016-05-03 14:09:05

标签: regex regex-negation regex-lookarounds

我正在解析IBM JVM线程转储以提取各种信息。在当前上下文中,线程正在等待的锁定ID,以及拥有该锁定的线程的id。锁定ID在所有转储中都是一致的,它采用十六进制值0x000000000B0D9A20的形式。但是线程持有锁的id采用不同的值,例如与锁定ID相同的形式的hex id或类似<unknown><unowned>的值。这是锁主人的身份证,我发现很难提取。

IBM线程转储使用三个子句指定锁定信息(如第一个屏幕截图所示):

  1. Waiting on...
  2. Blocked on...
  3. Parked on...
  4. 我正在对正则表达式中的这些子句执行OR运算。

    我写了一个接受

    的通用方法
    1. 线程转储行
    2. 正则表达式申请
    3. 要在列表中返回的组数
    4. 例如,method1(threadDumpLine,regex,2)号召唤regex会在threadDumpLine上应用[group1,group2],并返回group1列表group2,其中<unknown>是在{{1}时捕获的第一个群组是第二个。

      第一组需要是锁定ID,我能够捕获,但第二组可以是十六进制ID或<unowned><unowned>。我能够将锁拥有者的ID作为第二组捕获,但是当它是<unknown><text>时,它结果是第3组:

      enter image description here (上面regex101

      这种情况正在发生,因为我定义了两个独立的组来捕获锁拥有者的id和{{1}}。所以我尝试将两者结合在一起如下:

      enter image description here (上面regex101

      如何以尽可能少的步骤更改上面指定的正则表达式?

2 个答案:

答案 0 :(得分:0)

您可以使用此基于否定的正则表达式来获取正确捕获的组#2:

(?:Blocked on|Parked on|Waiting on):[^@]*@(0x[0-9A-F]+) Owned by:[^<\n]*(0x[0-9]+|[^>\n]+)

RegEx Demo

这将提供以下匹配数据:

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]+|<.*?>)

demo