捕获重复模式的正则表达式问题

Regex trouble with capturing repeated pattern

假设我有以下字符串:

Some crap string here...(TRACK "title1" F (S #h88 (P #m6) (P #m31)) (S #k3 (P #m58) (P #m58)))(TRACK "title2" P (S #a54 (P #r8)) (S #v59 (P #a25) (P #y82)))...Some other crap string here

我需要从这个字符串中提取以下数据:

  1. 标题1
  2. F
  3. (S #h88 (P #m6) (P #m31)) 和 (S #k3 (P #m58) (P #m58))

  1. 标题2
  2. P
  3. (S #a54 (P #r8)) 和 (S #v59 (P #a25) (P #y82))

哪里

  1. 是某种标题。
  2. 是某种状态。
  3. 是某种列表列表,例如 (S #xx (P #xx)).

正则表达式知识有限,我可以得到 1 和 2,但只能得到 3 的第一部分。
(S #xx (P #xx))可以存在多次,内部(P#xx)也可以存在多次

我尝试了很多正则表达式并查阅了很多帖子,但我总是无法按要求取出数据。

所以现在我回到 \(TRACK "(.*?)" ([P|F]) (\(S.*?\)\)),它只捕获此示例字符串中两个列表中的第一个。

参见:https://regex101.com/r/FM0ZZR/1

我需要做什么才能获得所描述的所有列表?

您可以使用

\(TRACK\s+"([^"]*)"\s+([PF])((?:\s+(\([SP](?:[^()]*+|(?-1))*\)))*\))

参见regex demo

详情

  • \(TRACK - (TRACK 子串
  • \s+ - 一个或多个空格
  • " - 一个 " 字符
  • ([^"]*) - 第 1 组:除 "
  • 之外的任何零个或多个字符
  • " - 一个 " 字符
  • \s+ - 一个或多个空格
  • ([PF]) - 第 2 组:PF
  • ((?:\s+(\([SP](?:[^()]*+|(?-1))*\)))*\)) - 第 3 组:
    • (?:\s+(\([SP](?:[^()]*+|(?-1))*\)))* - 零次或多次重复
      • \s+ - 一个或多个空格
      • (\([SP](?:[^()]*+|(?-1))*\)) - 第 4 组(技术性的,递归所必需的):
        • \( - 一个 ( 字符
        • [SP] - SP
        • (?:[^()]*+|(?-1))* - () 以外的零个或多个字符或整个最近捕获的模式
        • \) - 一个 ) 字符
    • \) - 一个 ) 字符。