【问题标题】:Extracting only the first occurance between square brackets in a line仅提取一行中方括号之间的第一个匹配项
【发布时间】:2019-10-21 08:44:43
【问题描述】:

我想提取给定行中方括号之间的唯一值。 来自正文

TID: [-1] [] [2019-07-29 10:18:41,876]  INFO

我想提取方括号之间的第一个匹配项,即 -1。 我尝试使用

(?<Ten ID>((^(?!(TID: )))*((?<=\[).*?(?=\]))))

但它给了

-1, ,2019-07-29 10:18:41,876

作为结果匹配。

如何只捕获第一次出现?

您可以访问正则表达式编辑器here

【问题讨论】:

  • 字符串必须以”TID: “ 开头和/或以显示的结尾,还是只想要第一对括号之间的内容而不管之前和之后的内容?换句话说,什么必须匹配而不是必须提取什么?
  • @Cary 我需要提取第一对括号之间的内容。有没有不组捕的解决方案?

标签: regex ruby


【解决方案1】:

关于

有没有不分组捕获的解决方案?

你可以使用

/\bTID:\s*\[\K[^\]]+(?=\])/

Rubular demo

详情

  • \bTID: - 整个单词 TID 后跟冒号
  • \s* - 0+ 空白字符
  • \[ - 一个 [ 字符
  • \K - 匹配重置运算符,丢弃目前匹配的文本
  • [^\]]+ - 除了] 之外的一个或多个字符
  • (?=\]) - 正向前瞻,确保在当前位置右侧有一个 ] 字符。

【讨论】:

  • 是否有替代组捕获的方法?即使这是正确的,我的程序(Fluentd)只查找匹配结果部分。
  • @Charith_32 如果您需要命名组,请使用\bTID:\s*\[(?&lt;Grp1&gt;[^\]]+)\]。如果您只需要获取完整匹配,请使用\K 和前瞻:\bTID:\s*\[\K[^\]]+(?=\]),请参阅this Rubular demo
【解决方案2】:

您可以使用negated character class 捕获命名捕获组中的第一次出现:

\ATID: \[(?<Ten ID>[^\[\]]+)\]
  • \A 字符串开始
  • TID: 字面匹配
  • \[匹配[
  • (?&lt;Ten ID&gt;命名捕获组十ID
    • [^\[\]]+ 不匹配 [] 使用否定字符类
  • )关闭群
  • \]匹配]

https://rubular.com/r/4Hc80yrDxGVgvi

【讨论】:

    【解决方案3】:
    str = “TID:] [-1] [] [2019-07-29 10:18:41,876]  INFO”
    
    i1 = str.index(‘[‘)
      #=> 6
    i2 = str.index(‘]’, i1+1)
      #=> 9
    i1.nil? || i2.nil? ? nil : str[i1+1..i2-1]
      #=> “-1”
    

    【讨论】:

      猜你喜欢
      • 2021-02-28
      • 1970-01-01
      • 2021-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-17
      • 2021-06-17
      • 2015-05-07
      相关资源
      最近更新 更多