我有一个字符串
fw[0000]: IN=br1 MAC=00:80:00:00:00:8b SRC=0000::0000:000:0000:0000 DST=0000::1:2 LEN=179 PROTO=UDP DPT=547 Unsolicited IPv6 Packet
并且想要提取消息的最后一部分,从而得到的捕获是
Unsolicited IPv6 Packet
我正在使用这个当前的正则表达式字符串([^=]*$)
,它使我获得
547 Unsolicited IPv6 Packet
但我一直纠结于如何将CCD_ 2从捕获组中排除。换句话说,捕获最后等号之后的所有内容,同时排除等号和前面第一个空格之间的内容。
547
在这里只是一个任意的值。另一日志行可以具有PROTO=UDP
作为结束消息文本之前的最终键/值对。
如果您的工具或语言可以访问正则表达式捕获组,那么您可以将正则表达式表述为消耗所有内容,包括最后一个键值对:
^.*b[^=s]+=[^=s]+s+(.*)$
演示
您想要的匹配将显示为第一个捕获组$1
。
使用"正向向后看":
(?<=s)([^=]*)$
在这里测试。
其工作原理如下:(?<=Y)X
与X
匹配,但前提是之前有Y
在这种情况下,[^=]*
从最后的=
到行尾匹配,但仅匹配第一个空格之前的部分。
请记住,当消息文本包含=
时,原始正则表达式([^=]*$)
将无法按预期工作。
您可以匹配等号和第一个"单词";后面跟一个空格(或1个或多个空白字符的s+
)
=[^s=]+s+([^=]*$)
查看regex演示
另一个选项是太匹配,直到最后一个等号之后匹配第一个"0";单词";以及1个或多个空白。
在组1中捕获至少匹配一个非空白字符,然后匹配除等号之外的其余字符。
^.*=[^=s]+s+(S[^=]+)$
查看另一个regex演示