【问题标题】:PHP Regex, capture repetition matchesPHP Regex,捕获重复匹配
【发布时间】:2015-10-15 13:27:22
【问题描述】:

这是一个非常人为的例子,但我搜索了诸如“正则表达式捕获重复匹配”之类的东西,但没有运气。

How to get all captures of subgroup matches with preg_match_all()? 是我得到的最近的。

这里(有点)是我的问题,而不是一个例子。

我在表单中有一个标签:

 name>>thing1(d1),thing2(d2),thing3(d3)::otherName

我想提取namethings 及其数据(最多一个参数)和最后的位,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 - 我提出这个问题是因为性能在我的脑海中,而我的规则已经查看了信息,我只需要抓住它。所以我不会说这是一个过早的优化。

【问题讨论】:

  • 想想如果你在重复中有重复,知道结果数组中的什么来自哪里需要更多信息。不过我还是想知道有没有办法
  • 重复捕获组只会捕获最后一次迭代。您需要在重复组周围放置一个捕获组以捕获所有迭代。
  • @WashingtonGuedes 如果我将示例更改为(([a-z])+),那么我将得到bc 作为匹配项和c。不是bc 的数组,这是我的目标。正如我提到的,我的后备方案是捕获很多,然后preg_match_all 它。
  • 为什么不preg_match_all
  • @iismathwizard 看到上面的评论,我应该把它添加到问题中吗?现在更有意义了吗?

标签: php regex


【解决方案1】:

因此,正如 cmets 中所讨论的(并阻止人们发布与文本匹配的规则(认真,阅读 Q))我将在此处发布“解决方案”。

我使用这条规则:

^([a-z]+)>>(.*)::([a-z]+)$

(或类似的东西)

然后我可以在中间捕获使用preg_match_all 并以这种方式提取数据。令人讨厌的是,这不会检查逗号。但我可以取消这个要求。

比如:

 preg_match_all("([a-z]+)\(([a-z]+)\)",...

关于那个。

【讨论】:

  • 有人否决了这个!我至少要把它投票给 0。
  • @anubhava 以防不清楚重复的组。
  • @anubhava 如果您对字符串 abc 执行 /^a(.)+$,则第一次捕获报告为 c(它匹配的最后一件事)-我想要一个包含 2 个元素的数组,bc 为此。这是不可能的。
  • preg_match_all('/(^a|\G)(.)/', 'abc', $matches); print_r($matches);bc 作为 2 个单独的匹配项。
【解决方案2】:

也许我遗漏了什么……你不能用这样的东西吗:

/(?:(.*)>>)|(?:(thing.*?\)),?)|(?:::(.*))/g

【讨论】:

  • 是的,你是。这如何获得带有数据的事物数组?这正好匹配整个事情。
  • regex101.com/r/qQ2dE4/75 似乎认为它有效。好吧,它完成了我认为你所要求的,即产生这些匹配:name thing1(d1) thing2(d2) thing3(d3) otherName
  • 因为你错过了cmets,我已经添加到问题中,请忽略其他回答的人。
  • 我明白了我实际上错过了什么,那就是你希望 thing1 和 d1 分别匹配
  • 我没主意了。也许切换到.NET :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-21
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多