PHP Regex help - анализ наборов данных в зависимости от формата - PullRequest
0 голосов
/ 07 марта 2011

Я занимаюсь разработкой игры для игры в стиле регби на форуме и ищу помощь в разработке синтаксического анализатора regx для анализа наборов игр.

Каждый пост может иметь следующие форматы (разница в том, что некоторые люди могут использоватьзапятая, чтобы разбить игры, а также некоторые могут гиперназвать счет - или любое сочетание этих двух):

TEAMA 25-31 TEAMB TEAMC 28-35 TEAMD TEAME 38-10 TEAMF TEAMG 21-15 TEAMH

.

TEAMA 25 31 TEAMB TEAMC 28 35 TEAMD TEAME 38 10 TEAMF TEAMG 21 15 TEAMH

.

TEAMA 25-31 TEAMB, TEAMC 28-35 TEAMD, TEAME 38-10 TEAMF, TEAMG 21-15 TEAMH

.

TEAMA 25 31 TEAMB, TEAMC 28 35 TEAMD, TEAME 38 10 TEAMF, TEAMG 21 15 TEAMH

В основном команды всегда должны иметь длину 5 символов, и счет должен находиться между двумя командами, но не всегдаодинаковое количество игр в отдельном посте, т.е. один пост может быть одной игрой или 20Также может быть дополнительный текст до или после, но все же нужно иметь возможность вырывать игры.Просто нужно разделить каждую игру, то есть [TEAMA] [SCORE] [SCORE] [TEAMB] будет считаться одной игрой.

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

Любая помощь приветствуется.

Ответы [ 4 ]

3 голосов
/ 07 марта 2011

Проще сопоставить каждый результат, чем разделить их, например ::1001

preg_match_all('/(?P<teamA>\w{5})\s+(?P<scoreA>\d+)[\s-](?P<scoreB>\d+)\s+(?P<teamB>\w{5})/', $str, $m, PREG_SET_ORDER);
print_r($m);

Дает вам за каждый результат, что-то вроде:

[0] => Array
    (
        [0] => TEAMA 25 31 TEAMB
        [teamA] => TEAMA
        [1] => TEAMA
        [scoreA] => 25
        [2] => 25
        [scoreB] => 31
        [3] => 31
        [teamB] => TEAMB
        [4] => TEAMB
    )
0 голосов
/ 07 марта 2011

регулярное выражение: [A-Z]{5}\s\d+[\s\-]\d+\s[A-Z]{5}

Вот рабочий пример использования в perl:

my $content = "TEAMA 25-31 TEAMB TEAMC 28 35 TEAMD TEAME 38-10 TEAMF TEAMG 21-15 TEAMH";
my (@scores) = $content =~ m![A-Z]{5}\s\d+[\s\-]\d+\s[A-Z]{5}!g;

foreach my $score (@scores) {
  print "$score\n";
}

Вывод:

TEAMA 25-31 TEAMB

TEAMC 28 35 TEAMD

TEAME 38-10 TEAMF

КОМАНДА 21-15 КОМАНДА

Если вам нравится любой случай с названием команды, вы можете использовать [A-Za-z] внутри [A-Z]

0 голосов
/ 07 марта 2011

альтернатива,

    $raw_str = "TEAMA 25-31 TEAMB TEAMC 28-35 TEAMD TEAME 38-10 TEAMF TEAMG 21-15 TEAMH";
preg_match_all('/(?<first_team_name>[A-Z]+)\s+(?<first_team_score>[0-9]+)-(?<second_team_score>[0-9]+)\s+(?<second_team_name>[A-Z]+)/i',$raw_str,$matches);
$scores = array();
foreach($matches[0] as $index => $match)
{
    $scores[] = array(
                    'first_team_name' =>  $matches['first_team_name'][$index],
                    'first_team_score' =>  $matches['first_team_score'][$index],
                    'second_team_name' =>  $matches['second_team_name'][$index],
                    'second_team_score' =>  $matches['second_team_score'][$index]
                    );
}

print_r($scores);

Вывод:

Array ([0] => Array ([first_team_name] => TEAMA [first_team_score] => 25 [second_team_name]=> TEAMB [second_team_score] => 31)

[1] => Array
    (
        [first_team_name] => TEAMC
        [first_team_score] => 28
        [second_team_name] => TEAMD
        [second_team_score] => 35
    )

[2] => Array
    (
        [first_team_name] => TEAME
        [first_team_score] => 38
        [second_team_name] => TEAMF
        [second_team_score] => 10
    )

[3] => Array
    (
        [first_team_name] => TEAMG
        [first_team_score] => 21
        [second_team_name] => TEAMH
        [second_team_score] => 15
    )

)

0 голосов
/ 07 марта 2011

Вы можете попробовать регулярное выражение, подобное этому (предполагается, что названия команд буквенно-цифровые)

([a-zA-Z0-9]{5})\s+(\d+)[\s-](\d+)\s+([a-zA-Z0-9]{5})

http://rubular.com/r/v4HGNzo3UY

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...