use strict; while () { s/[\s\(\)]+//g; # strip optional chars my @matches = m/(\d+)|([^\d]+)/g; print join ":", grep { defined $_ and $_ !~ m/^(r|rd|red)$/i } @matches; } #### $ echo "12345 (Gray) 6789 (Red)" | ./red.pl 12345:Gray:6789 $ echo "12345 (Gray) 6789 Red" | ./red.pl 12345:Gray:6789 $ echo "12345Gray6789Red" | ./red.pl 12345:Gray:6789