2014-12-24 3 views
0

Я работаю в 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 и г модификатора но безуспешно. Я знаю, что preg_match_all сможет получить мне то, что я хотел, если бы я ТОЛЬКО хотел бы пары вкладов с рейком игроков, но перед этим я также требую данных.

Очевидно, что я могу использовать взрыв и анализировать данные самостоятельно, но перед тем, как спуститься по этому маршруту, мне нужно знать, если/как это можно сделать с помощью чистого регулярного выражения.

+0

Что ваше ожидаемый результат? –

+1

Что происходит «Например, я хочу получить что-то вроде этого:« – Abovestand

+2

Он не будет работать с 'preg_match_all' или' g', потому что повторение группы '() *' будет сохраняться только в последнем случае, которое является 'cindy'' Как ожидалось – nu11p01n73R

ответ

1

Вы можете использовать ниже регулярное выражение,

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

DEMO

| в последний из первого не-захвата группы помогает регулярное выражение двигатель, чтобы соответствовать символы из оставшейся строки, используя шаблон, который следует за группой, не участвующей в захвате.

1

Я хотел бы использовать следующий Regex для проверки входной строки:

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

А затем просто использовать функцию explode() на последнюю группу захвата, чтобы разделить игрок из:

preg_match($regex, $string, $matches); 
$players = explode(', ', $matches[2]); 
Смежные вопросы