>perl -wMstrict -le "my @strs = ( 'Servername FOO', 'fine Servername FOO yyy', 'no Servername FOO zzz', 'cool Servername BAR', 'nyet Servername BAR vvv', 'Servername BOFF', 'ok Servername BOFF yyy', 'no Servername BOFF zzz', ); ;; my @names = qw(FOO BAR); my @avoid = qw(no nyet); ;; my $find = join '|', @names; $find = qr{ Servername \s+ (?: $find) }xms; ;; my $not_before = join '|', @avoid; $not_before = qr{ (?: $not_before) \s+ Servername }xms; $not_before = qr{ (?: $not_before (*SKIP)(*FAIL))? }xms; ;; for my $s (@strs) { print qq{'$s'} if $s =~ m{ $not_before $find }xms; } " 'Servername FOO' 'fine Servername FOO yyy' 'cool Servername BAR'