获得与纯正则表达式的所有匹配?

时间:2014-12-24 14:32:53

标签: php regex

我正在使用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并解析数据,但在走这条路之前我需要知道是否可以用纯正则表达式完成这项工作。

2 个答案:

答案 0 :(得分:1)

您可以使用以下正则表达式

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

DEMO

第一个非捕获组的最后一个

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

答案 1 :(得分:1)

我会使用以下Regex来验证输入字符串:

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

然后只需使用上一个捕获组中的explode()函数将玩家分开:

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