使用正则表达式提取方括号中的字符串

Extract string in square bracket with regex

我在 splunk 中的日志如下:

[ A=xaxxxxx ] [ B=weea case ] [ C=another example 0 ]

如何只获取“=”后方括号中的字符串

像这样:xaxxxxxweea case; another example 0

我的霸王龙是:rex field=_raw "(?<New_Field>\[\sC=(.*?)\s\])"

它提取所有内容,包括方括号[...]。

在 Splunk 中,只能使用命名的捕获组将数据提取到字段中。因此,正则表达式中的编号捕获组对 Splunk 没有任何意义。您需要在需要提取的模式部分周围使用 New_Field 组。

另外,你只匹配了C,你可以用[A-Z]匹配任何大写字母,如果有多个,则[A-Z]+.

您可以使用

\[\s*[A-Z]+=\s*(?<New_Field>.*?)\s*]

regex demo详情:

  • \[ - 一个 [ 字符
  • \s* - 零个或多个空格
  • [A-Z]+ - 零个或多个大写 ASCII 字母
  • = - 一个 = 字符
  • \s* - 零个或多个空格
  • (?<New_Field>.*?) - 组“New_Field”:除换行字符外的任何零个或多个字符尽可能少
  • \s* - 零个或多个空格
  • ] - 一个 ] 字符。

您可以将不想捕获的内容移到组外:

\[\sC=(?<New_Field>[^\][]*)\s]

模式匹配:

  • \[\sC= 匹配 [ 空白字符和 =
  • (?<New_Field> 命名组 New_Field
  • [^\][]* 要留在方括号之间,可以使用否定字符 class
  • ) 关闭群组
  • \s\] 匹配空白字符和 ]

看到一个regex demo.

要匹配 A、B 或 C,您可以使用字符 class:

\[\s[A-Z]=(?<New_Field>[^\][]*)\s]

再看一个regex demo

这是一种更简单的方法 - 一种将在给定事件中 return all the matches 转换为多值字段的方法:

index=ndx sourcetype=srctp
| rex field=_raw max_match=0 "\[[^\[=]+\=(?<new_field>[^\]]+)"

从跳过左括号开始,等号之前的任何内容

那么等号后的所有内容都会匹配到右括号