use Regex::PreSuf; die presuf(split /\|/, 'new|old|number|start|simple|cross|heavy|die|exit'),$/; __END__ (?:cross|die|exit|heavy|n(?:ew|umber)|old|s(?:imple|tart)) #### use Benchmark 'cmpthese'; my @words = qw[ new old number start simple cross heavy die exit ]; my $string = join ' 0\4/f ', map( { rand $_ } 1 .. 60), map { $words[ rand @words ] } 1 .. 20; cmpthese( -3, { straight => sub { my $matches = () = $string =~ /new|old|number|start|simple|cross|heavy|die|exit/g; return; }, optimial => sub { my $matches = () = $string =~ /(?:cross|die|exit|heavy|n(?:ew|umber)|old|s(?:imple|tart))/g; return; }, }); __END__ C:\>perl re.bench.pl Rate straight optimial straight 1948/s -- -15% optimial 2288/s 17% -- C:\>perl re.bench.pl Rate straight optimial straight 1994/s -- -14% optimial 2322/s 16% -- C:\>perl re.bench.pl Rate straight optimial straight 1963/s -- -16% optimial 2324/s 18% --