假设我有以下字符串:
这里有些废话字符串...(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
- F
- (S #h88 (P #m6) (P #m31)) 和 (S #k3 (P #m58) (P #m58))
和
- 标题2
- P
- (S #a54 (P #r8)) 和 (S #v59 (P #a25) (P #y82))
在哪里
- 是某种标题。
- 是某种状态。
- 是某种列表列表,如
(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 组:P
或F
-
((?:\s+(\([SP](?:[^()]*+|(?-1))*\)))*\))
- 第 3 组:-
(?:\s+(\([SP](?:[^()]*+|(?-1))*\)))*
- 零次或多次重复-
\s+
- 一个或多个空格 -
(\([SP](?:[^()]*+|(?-1))*\))
- 第 4 组(技术性的,递归所必需的):-
\(
- 一个(
字符 -
[SP]
-S
或P
-
(?:[^()]*+|(?-1))*
- 除(
以外的零个或多个字符和)
或整个最近捕获的模式 -
\)
- 一个)
字符
-
-
-
\)
- 一个)
字符。
-
关于php - 捕获重复模式的正则表达式问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67093752/