捕获重复模式的正则表达式问题
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
- 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))*
- (
和 )
以外的零个或多个字符或整个最近捕获的模式
\)
- 一个 )
字符
\)
- 一个 )
字符。
假设我有以下字符串:
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
- 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))*
-(
和)
以外的零个或多个字符或整个最近捕获的模式\)
- 一个)
字符
\)
- 一个)
字符。