use warnings; use strict; my @strs = qw/a b c aa bb ccc aaaaa bbb cccccc aaaaaaa bbbb ccccccc/; use Regexp::Trie; my $rt = Regexp::Trie->new; $rt->add($_) for @strs; print $rt->regexp, "\n"; # (?^:(?:a(?:a(?:aaa(?:aa)?)?)?|b(?:b(?:bb?)?)?|c(?:cc(?:cccc?)?)?)) use Regexp::Assemble; my $ra = Regexp::Assemble->new; $ra->add($_) for @strs; print $ra->re, "\n"; # (?^:(?:a(?:a(?:(?:aa)?aaa)?)?|c(?:cc(?:c?ccc)?)?|b(?:b(?:b?b)?)?)) use Regex::PreSuf; my $re = presuf(@strs); print $re, "\n"; # (?:aa(?:aaa(?:aa)?)?|bb(?:bb|b)?|ccc(?:cccc?)?|[abc])