use strict; use warnings; # allowed prompt characters my $prompt_regex = '[>$%@~# ]'; # allowed characters in the prompt my $allowed_regex = '[\w@\-\.]*'; # a list of allowed prompt patterns my @patterns = ( '\[?' . $allowed_regex . $prompt_regex . '\]?', quotemeta '\\[\\e[0m\\] [0m', ); # build my regex dynamically my $regex = '(' . join('|',@patterns) .')\s?'; # test the regex print "regex: /$regex/\n\n"; while () { chomp; /$regex/ && printf "%-30smatched: %s\n", $_, $1; } __DATA__ roger@www.foo.com# blah roger@www.foo~ crap crap [roger@www#] blah blah foo [roger@www.foo~] crap crap \[\e[0m\] [0m foo bar