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

标签 php regex pcre

假设我有以下字符串:

这里有些废话字符串...(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)))...这里还有其他废话字符串

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

  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))* - 除 ( 以外的零个或多个字符和 )或整个最近捕获的模式
        • \) - 一个 )字符
    • \) - 一个 )字符。

关于php - 捕获重复模式的正则表达式问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67093752/

相关文章:

PHP CURL 很少出现 SSL 连接错误

php - Codeigniter XML 数据馈送到多个(MYSQL 表)

php - 这种 PCRE 模式如何检测回文?

regex - 何时在正则表达式中使用正向查找?

regex - Haskell 和正则表达式与交叉点

php - 将数据ajax发送到php,不刷新整个页面,而是在同一个文件中再次执行php

php - 将 php 值传递给 js 文件

regex - 什么是有效 Git 标签的正则表达式?

javascript - 在 JavaScript 中自动释义句子

regex - Sed:如何替换在文件中找到特定模式后找到的字符串