m[ ( ^ [^(:]+ ) (?: (?: \( ( \d+ ) \) )? : (?: .*? \( ( [^)]+ ) \) ){1,} .* )? $ ]x; #### #! perl -slw use strict; while( ) { 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)