regexp : multiline, 非贪婪匹配直到可选字符串

标签 regex go re2

使用 Go 的正则表达式,我试图从原始文本中提取一组预定义的有序键值(多行)对,其最后一个元素可能是可选的,例如,

 Key1:
  SomeValue1
  MoreValue1
 Key2:
  SomeValue2
  MoreValue2
 OptionalKey3:
  SomeValue3
  MoreValue3
(在这里,我想将所有值提取为命名组)
如果我使用默认的贪婪模式 (?s:Key1:\n(?P<Key1>.*)Key2:\n(?P<Key2>.*)(?:OptionalKey3:\n(?P<OptionalKey3>.*))?) ,它永远不会看到 OptionalKey3 并将文本的其余部分匹配为 Key2。
如果我使用非贪婪模式 (?s:Key1:\n(?P<Key1>.*)Key2:\n(?P<Key2>.*?)(?:OptionalKey3:\n(?P<OptionalKey3>.*))?) ,它甚至没有看到 SomeValue2 并立即停止:https://regex101.com/r/QE2g3o/1
有没有一种方法可以选择匹配 OptionalKey3 同时还能够捕获所有其他的?

最佳答案


(?s)\AKey1:\n(?P<Key1>.*)Key2:\n(?P<Key2>.*?)(?:OptionalKey3:\n(?P<OptionalKey3>.*))?\z
regex proof .
说明
--------------------------------------------------------------------------------
  (?s)                     set flags for this block (with . matching
                           \n) (case-sensitive) (with ^ and $
                           matching normally) (matching whitespace
                           and # normally)
--------------------------------------------------------------------------------
  \A                       the beginning of the string
--------------------------------------------------------------------------------
  Key1:                    'Key1:'
--------------------------------------------------------------------------------
  \n                       '\n' (newline)
--------------------------------------------------------------------------------
  (?P<Key1>                 group and capture to "Key1":
--------------------------------------------------------------------------------
    .*                       any character (0 or more times (matching
                             the most amount possible))
--------------------------------------------------------------------------------
  )                        end of "Key1"
--------------------------------------------------------------------------------
  Key2:                    'Key2:'
--------------------------------------------------------------------------------
  \n                       '\n' (newline)
--------------------------------------------------------------------------------
  (?P<Key2>                group and capture to "Key2":
--------------------------------------------------------------------------------
    .*?                      any character (0 or more times (matching
                             the least amount possible))
--------------------------------------------------------------------------------
  )                        end of "Key2"
--------------------------------------------------------------------------------
  (?:                      group, but do not capture (optional
                           (matching the most amount possible)):
--------------------------------------------------------------------------------
    OptionalKey3:            'OptionalKey3:'
--------------------------------------------------------------------------------
    \n                       '\n' (newline)
--------------------------------------------------------------------------------
    (?P<OptionalKey3>         group and capture to "OptionalKey3":
--------------------------------------------------------------------------------
      .*                       any character (0 or more times
                               (matching the most amount possible))
--------------------------------------------------------------------------------
    )                        end of "OptionalKey3"
--------------------------------------------------------------------------------
  )?                       end of grouping
--------------------------------------------------------------------------------
  \z                       the end of the string

关于regexp : multiline, 非贪婪匹配直到可选字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68107667/

相关文章:

regex - 如何在谷歌数据工作室中创建一个新的指标,并在字段中计数特定术语

regex - Delphi中的RegEx剥离回车符和换行符

python - 用于删除括号中数据的正则表达式

javascript - Unicode Javascript - 需要向用户显示无效字符

golang 如何将 uint64 转换为 int64?

go - panic : runtime error: index out of range [recovered]

python - 从特定字符后的字符串中提取数字

objective-c - 在 Objective-C 中实现 Go 中的 ‘defer’ 语句?

ruby - RE2 正则表达式中如何使用命名捕获组?