这是一个非常人为的例子,但我已经搜索了类似"正则表达式捕获重复匹配的内容"等等没有运气。
How to get all captures of subgroup matches with preg_match_all()?是我得到的最近的。
而不是一个例子,这是我的问题(
)我的表格中有一个标签:
name>>thing1(d1),thing2(d2),thing3(d3)::otherName
我想提取name
,thing
s及其数据(最多一个参数)和最后一位,otherName
执行此操作的规则可能类似于:
^([a-z]+)>>(([a-z]+\([a-z]+\)(,[a-z]+\([a-z]+\))*)?::([a-zA-Z]]+)$
(这条规则实际上不起作用,我错过了数字,但你应该对表格有所了解)
正如你所看到的,我实际上在这里匹配我的模式,我想用*
我在匹配我的代码时遇到问题。我想一步提取标签的所有部分。所以我想要一个像:
这样的数组 Array(`name`,Array(`thing1`,`d1`),Array(Array(`thing2`,`d2`),
Array(`thing3`,`d3`)),`otherName`)
我想在一个表达式中执行此操作,因为我认为没有技术原因无法执行此操作。然而,作为"计划B"我可以在>>
和::
之间提取大块并使用preg_match_all
- 我提出这个问题,因为性能在我的脑海里,我的规则已经看到了信息,我只需抓住它。所以我不会说这是一个不成熟的优化。
答案 0 :(得分:1)
正如评论中所述(并阻止人们发布与文本匹配的规则(严重,请阅读Q)),我将在此处发布“解决方案”。
我使用这条规则:
^([a-z]+)>>(.*)::([a-z]+)$
(或者那种效果)
然后我可以在中间捕获上使用preg_match_all
并以这种方式提取数据。令人讨厌的是,这并没有检查逗号。但我可以废除这一要求。
类似于:
preg_match_all("([a-z]+)\(([a-z]+)\)",...
就是这样。
答案 1 :(得分:0)
也许我错过了一些东西......你不能用这样的东西:
/(?:(.*)>>)|(?:(thing.*?\)),?)|(?:::(.*))/g