.* 之间的可选元素?

Optional element between .*?

我正在尝试通过 PCRE 从以下示例中提取可选元素。 如果ActivityID存在,我需要拉出xxxx-xxx-xxxx-xxxx-xxxxx

我猜我需要使用前瞻等,但我不能完全理解它。

</Level><Task>...<Correlation ActivityID='{xxxx-xxx-xxxx-xxxx-xxxxx}'/><Execution...</Channel>
This works if the element exists, saving to taco64:
<\/level>(?<taco16>.*?)ActivityID='{(?<taco64>.*)}'(?<taco32>.*?)<Computer>

Being optional drops everything into taco32. 
<\/level>(?<taco16>.*?)(ActivityID='{(?<taco64>.*)}')?(?<taco32>.*?)<Computer>

使用

<\/level>(?:(?<taco16>.*?)(ActivityID='{(?<taco64>.*)}'))?(?<taco32>.*?)<Computer>

参见regex proof

解释

--------------------------------------------------------------------------------
  <                        '<'
--------------------------------------------------------------------------------
  \/                       '/'
--------------------------------------------------------------------------------
  level>                   'level>'
--------------------------------------------------------------------------------
  (?:                      group, but do not capture (optional
                           (matching the most amount possible)):
--------------------------------------------------------------------------------
    (?<taco16>                 group and capture to taco16:
--------------------------------------------------------------------------------
      .*?                      any character except \n (0 or more
                               times (matching the least amount
                               possible))
--------------------------------------------------------------------------------
    )                        end of taco16
--------------------------------------------------------------------------------
    (?<taco64>               group and capture to taco64:
--------------------------------------------------------------------------------
      ActivityID='{            'ActivityID=\'{'
--------------------------------------------------------------------------------
      (                        group and capture to :
--------------------------------------------------------------------------------
        .*                       any character except \n (0 or more
                                 times (matching the most amount
                                 possible))
--------------------------------------------------------------------------------
      )                        end of taco64
--------------------------------------------------------------------------------
      }'                       '}\''
--------------------------------------------------------------------------------
    )                        end of 
--------------------------------------------------------------------------------
  )?                       end of grouping
--------------------------------------------------------------------------------
  (?<taco32>                group and capture to taco32:
--------------------------------------------------------------------------------
    .*?                      any character except \n (0 or more times
                             (matching the least amount possible))
--------------------------------------------------------------------------------
  )                        end of taco32
--------------------------------------------------------------------------------
  <Computer>               '<Computer>'