忽略字符,直到使用正则表达式匹配字符后出现空白

  • 本文关键字:字符 空白 正则表达式 regex
  • 更新时间 :
  • 英文 :


我有一个字符串

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)XX匹配,但前提是之前有Y

在这种情况下,[^=]*从最后的=到行尾匹配,但仅匹配第一个空格之前的部分。

请记住,当消息文本包含=时,原始正则表达式([^=]*$)将无法按预期工作。

您可以匹配等号和第一个"单词";后面跟一个空格(或1个或多个空白字符的s+)

=[^s=]+s+([^=]*$)

查看regex演示

另一个选项是太匹配,直到最后一个等号之后匹配第一个"0";单词";以及1个或多个空白。

在组1中捕获至少匹配一个非空白字符,然后匹配除等号之外的其余字符。

^.*=[^=s]+s+(S[^=]+)$

查看另一个regex演示

最新更新