#!perl -w my $test = ( "olive&(popeye|bluto)", "(tom&jerry)|(sylvester&tweety)", "moe&(shemp|curly|joe)&larry", "tom&jerry|sylvester&tweety", # valid "moe ( shemp | curly | joe ) larry", # also valid "moe(&shemp|curly|joe)&larry", # invalid: "(&" instead of "&(" "moe ( shemp | curly | joe", # invalid: missing ")" raises an error )[(shift) - 1]; my $expr = $test; $expr =~ s/(\w+)/"(?=.*\\b($1)\\b)"/ge; $expr =~ s/[\&\s]//g; $expr = "^($expr)"; print "$test\n$expr\n----\n"; while () { print $_ if /$expr/; } __DATA__ tom,jerry jerry,tom jerry,tomas sylvester,tweety tweeter,sylvester tom,sylvester popeye,olive olive,brutus moe,larry shemp,curly,joe larry,moe larry,curly,moe