正则表达式规则可选匹配字符集在特定点
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,因为:
- 捕捉到一个事实,即我们总是有一个 (,一个文字字符和一个 ) 与
\(\w+\)
- 捕获,如案例 2,如果在那之后我们有一个 [,一个数字和一个 ],其中
\[*\d*\]*
- 在每种情况下,以下字符都是
:
,我用 \:
捕获它
- 消息被捕获并命名为
(?<message>[^\[]+?\.)
如果在 :
之后我有一个 [
则必须避免捕获操作。当我得到 .
时捕获停止
我的问题是:在 :
之后我可以得到案例 3;它总是以 CID=<exadecimal expression>;
开头,但不仅限于此。在它之后,我可以有其他表达式总是以 ;
结束所以我们可以说我可以有,对于情况 3,CID=<hex expression><other numeric and literal characters>;
。
当然,对于当前的正则表达式, CIDR
部分包含在消息中。我必须避免它;如果存在 CIDR
部分,则消息捕获必须在结束它的 ;
之后开始。
所以,我们可以总结一下:
IF 在 :
之后我们没有 CIDR 字,开始捕获;否则,在 ;
之前避免捕获并在它之后开始作业。
以下模式将匹配您的测试字符串的正确部分。
我们寻找 :
后跟 CID ?!CID
或 ;
。然后我们捕获以下内容。
((:(?!CID))|;)(.*)
您可以将模式写为:
\(\w+\)(?:\[\d+\])?:(?:CID=[^;]*;)?(?<message>[^.]+\.)
说明
\(\w+\)
匹配括号之间的 1+ 个单词字符
(?:\[\d+\])?
可选择匹配方括号之间的 1+ 位数字
:
匹配冒号(不用转义)
(?:CID=[^;]*;)?
可选择匹配 CID= 部分直到第一个分号
(?<message>[^.]+\.)
分组 message,匹配 .
以外的 1+ 个字符,然后匹配 .
看到一个regex demo。
我正在 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,因为:
- 捕捉到一个事实,即我们总是有一个 (,一个文字字符和一个 ) 与
\(\w+\)
- 捕获,如案例 2,如果在那之后我们有一个 [,一个数字和一个 ],其中
\[*\d*\]*
- 在每种情况下,以下字符都是
:
,我用\:
捕获它
- 消息被捕获并命名为
(?<message>[^\[]+?\.)
如果在:
之后我有一个[
则必须避免捕获操作。当我得到.
时捕获停止
我的问题是:在 :
之后我可以得到案例 3;它总是以 CID=<exadecimal expression>;
开头,但不仅限于此。在它之后,我可以有其他表达式总是以 ;
结束所以我们可以说我可以有,对于情况 3,CID=<hex expression><other numeric and literal characters>;
。
当然,对于当前的正则表达式, CIDR
部分包含在消息中。我必须避免它;如果存在 CIDR
部分,则消息捕获必须在结束它的 ;
之后开始。
所以,我们可以总结一下:
IF 在 :
之后我们没有 CIDR 字,开始捕获;否则,在 ;
之前避免捕获并在它之后开始作业。
以下模式将匹配您的测试字符串的正确部分。
我们寻找 :
后跟 CID ?!CID
或 ;
。然后我们捕获以下内容。
((:(?!CID))|;)(.*)
您可以将模式写为:
\(\w+\)(?:\[\d+\])?:(?:CID=[^;]*;)?(?<message>[^.]+\.)
说明
\(\w+\)
匹配括号之间的 1+ 个单词字符(?:\[\d+\])?
可选择匹配方括号之间的 1+ 位数字:
匹配冒号(不用转义)(?:CID=[^;]*;)?
可选择匹配 CID= 部分直到第一个分号(?<message>[^.]+\.)
分组 message,匹配.
以外的 1+ 个字符,然后匹配.
看到一个regex demo。