【问题标题】:Get all matches with pure regex?使用纯正则表达式获取所有匹配项?
【发布时间】:2014-12-24 14:32:52
【问题描述】:

我正在使用 PHP,需要解析如下所示的字符串:

Rake (100) Pot (1000) Players (andy: 10, bob: 20, cindy: 70)

我需要知道每个玩家的抽水、底池和抽水贡献。玩家的数量是可变的。顺序无关紧要,只要我能匹配玩家姓名以一致的方式获得贡献。

例如,我希望得到这样的东西:

Array
(
    [0] => Rake (100) Pot (1000) Players (andy: 10, bob: 20, cindy: 70)
    [1] => 100
    [2] => 1000
    [3] => andy
    [4] => 10
    [5] => bob
    [6] => 20
    [7] => cindy
    [8] => 70
)

我能够想出一个匹配字符串的正则表达式,但它只返回最后一个玩家-耙子贡献对

^Rake \(([0-9]+)\) Pot \(([0-9]+)\) Players \((?:([a-z]*): ([0-9]*)(?:, )?)*\)$

输出:

Array
(
    [0] => Rake (100) Pot (1000) Players (andy: 10, bob: 20, cindy: 70)
    [1] => 100
    [2] => 1000
    [3] => cindy
    [4] => 70
)

我尝试过使用 preg_match_all 和 g 修饰符,但没有成功。我知道 preg_match_all 能够得到我想要的,如果我只想要玩家-抽水贡献对,但在此之前我还需要数据。

显然我可以自己使用explode和解析数据,但在走这条路之前,我需要知道是否/如何使用纯正则表达式来完成。

【问题讨论】:

  • 你的预期输出是什么?
  • 接下来会发生什么“例如,我希望得到这样的东西:”
  • 它不适用于preg_match_allg,因为重复()* 捕获组只会按预期保存最后一次出现的cindy 70
  • @nu11p01n73R 这些只是我考虑过的想法——那我该怎么做呢?
  • 为什么要获得a

标签: php regex


【解决方案1】:

你可以使用下面的正则表达式,

(?:^Rake \(([0-9]+)\) Pot \(([0-9]+)\) Players \(|)(\w+):?\s*(\d+)(?=[^()]*\))

DEMO

| 在第一个非捕获组的最后一个帮助正则表达式引擎使用非捕获组后面的模式匹配剩余字符串中的字符。

【讨论】:

    【解决方案2】:

    我将使用以下正则表达式来验证输入字符串:

    ^Rake \((?<Rake>\d+)\) Pot \((?<Pot>\d+)\) Players \(((?:\w*: \d*(?:, )?)+)\)$
    

    然后在最后一个捕获组上使用explode() 函数将玩家分开:

    preg_match($regex, $string, $matches);
    $players = explode(', ', $matches[2]);
    

    【讨论】:

      猜你喜欢
      • 2013-05-09
      • 1970-01-01
      • 2010-10-13
      • 1970-01-01
      • 1970-01-01
      • 2010-11-16
      • 1970-01-01
      • 2020-07-19
      • 1970-01-01
      相关资源
      最近更新 更多