in reply to String parsing

Hard to do robustly with a regex

while(<DATA>) { chomp; my ( @bits, $rest ); ( $bits[0], $rest ) = split ':', $_, 2; $bits[0] =~ tr/()//d; push @bits, ($rest =~ m!\(([^)]+)!g) if $rest; print "@bits\n"; } __DATA__ OFF SUCCESS: (abc) ERROR(1): disk number (27) crashed at (11:03) WARNING(1): system is rebooting

Which gives you

OFF SUCCESS abc ERROR1 27 11:03 WARNING1

cheers

tachyon

Replies are listed 'Best First'.
Re: Re: String parsing
by BrowserUk (Patriarch) on Jan 05, 2004 at 12:42 UTC

    Don't you just wish that repeat counts would repeat enclosed captures? Then you could use

    m[ ( ^ [^(:]+ ) (?: (?: \( ( \d+ ) \) )? : (?: .*? \( ( [^)]+ ) \) ){1,} .* )? $ ]x;
    to grab repetative elements instead of having to do (or rather not do) things with built in limits, like this.
    #! perl -slw use strict; while( <DATA> ) { chomp; my @bits = grep{ defined } m[ ( ^ [^(:]+ ) (?: (?: \( ( \d+ ) \) )? : (?: .*? \( ( [^)]+ ) \) (?: .*? \( ( [^)]+ ) \) (?: .*? \( ( [^)]+ ) \) (?: .*? \( ( [^)]+ ) \) )? )? )? )? .* )? $ ]x; print join'/', @bits; } =Output P:\test>junk OFF SUCCESS/abc ERROR/1/27/11:03 WARNING/1 TEST/255/this/that/the other/and this =cut __DATA__ OFF SUCCESS: (abc) ERROR(1): disk number (27) crashed at (11:03) WARNING(1): system is rebooting TEST(255): (this) (that) (the other) (and this) (but not this)

    Examine what is said, not who speaks.
    "Efficiency is intelligent laziness." -David Dunham
    "Think for yourself!" - Abigail
    Hooray!