gpt4 book ai didi

regex - 通过正则表达式获取第二个匹配项

转载 作者:数据小太阳 更新时间:2023-10-29 08:02:20 26 4
gpt4 key购买 nike

我想通过使用正则表达式获得匹配模式的第二次出现(在括号内)。这是正文

[2019-07-29 09:48:11,928] @hr.com [2] [AM] WARN

我想从此文本中提取2。我尝试使用

(?<Ten ID>((^)*((?<=\[).+?(?=\]))))

但它匹配 2019-07-29 09:48:11,928 , 2 , AM .如何只得到 2

最佳答案

获取 [ 之间的子串和 ] (方括号)不包括您可以使用的括号 /\[([^\]\[]*)\]/正则表达式:

  • \[ - 一个 [字符
  • ([^\]\[]*) - 捕获第 1 组:除 [ 以外的任何 0+ 个字符和 ]
  • \] - 一个 ]字符。

要获得第二个匹配项,您可以使用

str = '[2019-07-29 09:48:11,928] @hr.com [2] [AM] WARN'
p str[/\[[^\]\[]*\].*?\[([^\]\[]*)\]/m, 1]

参见 this Ruby demo .在这里,

  • \[[^\]\[]*\] - 找到第一个 [...]子串
  • .*? - 尽可能少地匹配任何 0+ 个字符
  • \[([^\]\[]*)\] - 找到第二个 [...]子字符串并捕获内部内容,在第二个参数 1 的帮助下返回.

要得到第N个匹配,你也可以考虑使用

str = '[2019-07-29 09:48:11,928] @hr.com [2] [AM] WARN'
result = ''
cnt = 0
str.scan(/\[([^\]\[]*)\]/) { |match| result = match[0]; cnt +=1; break if cnt >= 2}
puts result #=> 2

参见 Ruby demo

请注意,如果匹配项少于您的预期,此解决方案将返回最后一个匹配的子字符串。

另一种不通用且只适合这种具体情况的解决方案:提取方括号内第一次出现的 int 数字:

s = "[2019-07-29 09:48:11,928] @hr.com [2] [AM] WARN"
puts s[/\[(\d+)\]/, 1] # => 2

参见 Ruby demo .

要在 Fluentd 中使用正则表达式,请使用

\[(?<val>\d+)\]

您需要的值在 val 中命名组。 \[火柴[ , (?<val>\d+)是一个命名的捕获组,匹配 1+ 个数字和 ]匹配 ] .

Fluentular显示:

Copy and paste to fluent.conf or td-agent.conf

           type tail       path /var/log/foo/bar.log       pos_file /var/log/td-agent/foo-bar.log.pos       tag foo.bar       format /\[(?\d+)\]/     

Records

 Key    Value val    2

关于regex - 通过正则表达式获取第二个匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57670874/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com