Как я могу извлечь различное количество групп цифр из строки Perl? - PullRequest
1 голос
/ 07 мая 2009

Я пытаюсь проанализировать строку в Perl в формате:

Messages pushed to the Order Book queues 123691 121574 146343 103046 161253

Я хочу получить доступ к числам в конце строки, поэтому намереваюсь сделать совпадение, например

/(\d+)/s

Моя проблема в том, что число значений в конце содержит переменное количество строк.

Каков наилучший способ отформатировать регулярное выражение, чтобы иметь возможность доступа к каждому из этих номеров по отдельности? Я разработчик C ++ и только изучаю Perl, поэтому я пытаюсь найти самый чистый способ Perl для этого.

Спасибо за вашу помощь.

Ответы [ 4 ]

6 голосов
/ 07 мая 2009

Просто используйте флаг / g, чтобы оператор сопоставления выполнил глобальное сопоставление. В контексте списка оператор сопоставления возвращает все результаты в виде списка:

@result = $string =~ /(\d+)/g;

Это работает, если нет других чисел, кроме конечных.

4 голосов
/ 07 мая 2009

Вы можете использовать оператор соответствия в контексте списка с глобальным флагом, чтобы получить список всех ваших захватов в скобках. Пример:

@list = ($string =~ /(\d+)/g);

В вашем списке теперь должны быть все группы цифр в вашей строке. См. Документацию по оператору совпадения для получения дополнительной информации.

1 голос
/ 07 мая 2009

"В скалярном контексте каждое выполнение m // g находит следующее совпадение, возвращает true, если оно совпадает, и false, если дальнейшее совпадение отсутствует" - (От perldoc perlop)

Таким образом, вы сможете создать глобальный цикл регулярных выражений, например:

while ($string =~ /(\d+)/g) {
    push @queuelist, $1;
}
0 голосов
/ 07 мая 2009

Я бы сделал что-то вроде этого:

my @numbers;
if (m/Messages pushed to the Order Book queues ([\d\s]+)/) {
   @numbers = split(/\s+/, $1);
}

Не нужно втиснуть его в одно регулярное выражение.

...