/ / Ako môžem extrahovať rôzny počet číslic z reťazca Perl? - regex, perl, viacnásobné zhody

Ako môžem získať rôzny počet skupín číslic z reťazca Perl? - regex, perl, viacnásobné zápasy

Pokúšam sa analyzovať reťazec v jazyku Perl vo formáte:

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

Chcem získať prístup k číslam na konci reťazca, takže mienim urobiť zápas

/(d+)/s

Môj problém je, že počet hodnôt na konci obsahuje premenlivý počet reťazcov.

Aký je najlepší spôsob formátovania regexpumáte prístup ku každému z týchto čísel jednotlivo? Som vývojár C ++ a učím sa Perl, takže sa snažím nájsť najčistejší Perl spôsob, ako to dosiahnuť.

Vďaka za vašu pomoc.

odpovede:

6 pre odpoveď č. 1

Stačí použiť príznak / g, aby operátor zápasu urobil globálnu zhodu. V kontexte zoznamu operátor zhody vráti všetky výsledky ako zoznam:

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

Funguje to, ak neexistujú žiadne iné čísla ako koncové čísla.


4 pre odpoveď č. 2

Operátor zhody môžete použiť v kontexte zoznamu s globálnou vlajkou na získanie zoznamu všetkých vašich zátvoriek. Príklad:

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

Váš zoznam by teraz mal obsahovať všetky skupiny číslic vo vašom reťazci. Pozrite si dokumentáciu k internetu operátor zápasu pre viac informácií.


1 pre odpoveď č. 3

„V skalárnom kontexte každé spustenie m // g nájde nasledujúcu zhodu, vráti true, ak sa zhoduje, a false, ak už neexistuje žiadna zhoda“ - (Z perldoc perlop)

Mali by ste teda byť schopní vytvoriť globálnu slučku regulárneho obvodu, napríklad:

while ($string =~ /(d+)/g) {
push @queuelist, $1;
}

0 pre odpoveď č. 4

Ja by som urobil niečo takéto:

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

Nie je potrebné ho napchávať do jedného regexu.