正则表达式规则可选匹配字符集在特定点

Regex rule optional matching characters set in a specific point

我正在 PRCE2 环境中使用正则表达式。

在我的切换日志中,我必须捕获一个文本字符串,我将其捕获为 "message" 并且位于特定位置。重点是它前面总是有一组以 : 结尾的字符,但在它们之后,我可以有或没有一些以 ; 结尾的上瘾字符,我必须能够跳过它们。

让我用我当前的正则表达式和一些日志示例进行解释。

可以说我有3次机会:

 1. (s)[18014]:Recorded command information.
 2. (l):User logged out.
 3. (s)[18014]:CID=0x11aa2222;The user succeeded in logging out of XXX.

我当前的正则表达式是:

\(\w+\)\[*\d*\]*\:(?<message>[^\[]+?\.)

适用于情况 1 和 2,因为:

我的问题是:在 : 之后我可以得到案例 3;它总是以 CID=<exadecimal expression>; 开头,但不仅限于此。在它之后,我可以有其他表达式总是以 ; 结束所以我们可以说我可以有,对于情况 3,CID=<hex expression><other numeric and literal characters>;。 当然,对于当前的正则表达式, CIDR 部分包含在消息中。我必须避免它;如果存在 CIDR 部分,则消息捕获必须在结束它的 ; 之后开始。

所以,我们可以总结一下: IF 在 : 之后我们没有 CIDR 字,开始捕获;否则,在 ; 之前避免捕获并在它之后开始作业。

以下模式将匹配您的测试字符串的正确部分。
我们寻找 : 后跟 CID ?!CID;。然后我们捕获以下内容。

((:(?!CID))|;)(.*)

https://regex101.com/r/JRB4Rq/1

您可以将模式写为:

\(\w+\)(?:\[\d+\])?:(?:CID=[^;]*;)?(?<message>[^.]+\.)

说明

  • \(\w+\) 匹配括号之间的 1+ 个单词字符
  • (?:\[\d+\])? 可选择匹配方括号之间的 1+ 位数字
  • :匹配冒号(不用转义)
  • (?:CID=[^;]*;)? 可选择匹配 CID= 部分直到第一个分号
  • (?<message>[^.]+\.) 分组 message,匹配 . 以外的 1+ 个字符,然后匹配 .

看到一个regex demo