>perl -wMstrict -le "my $s = 'x s m e f s f pl s f x'; ;; $s =~ qr/^.+(s m e f|s f pl|s f).+$/; print qq{'$1'}; print qq{ -------}; ;; my $alt = qr{ s[ ]m[ ]e[ ]f | s[ ]f[ ]pl | s[ ]x }xms; for my $s ( 'x s m e f s f pl s f x', 'x s f s f pl s m e f x', 'x s f s m e f s f pl x', ) { my ($longest) = reverse sort { length($a) <=> length($b) } $s =~ m{ (?<= .) $alt (?= .) }xmsg ; print qq{'$longest'}; } " 's f' ------- 's m e f' 's m e f' 's m e f' #### >perl -wMstrict -le "my $alt = qr{ s[ ]m[ ]e[ ]f | s[ ]f[ ]pl | s[ ]f }xms; my $rex = qr{ (?<= .) $alt (?= .) }xms; ;; for my $s ( 'x s m e f s f pl s f x', 'x s f s f pl s m e f x', 'x s f s m e f s f pl x', 'x s f s f x', 'x s s x', 's f', 's m e f', ) { local our $longest; local our $offset; use re 'eval'; $s =~ m{ ($rex) (?{ ($longest, $offset) = ($1, $-[1]) if ! defined($longest) || length($1) > length($longest) }) (*SKIP)(*FAIL) }xmsg; print qq{'$s' -> '$longest' at $offset} if defined $longest; } " 'x s m e f s f pl s f x' -> 's m e f' at 3 'x s f s f pl s m e f x' -> 's m e f' at 16 'x s f s m e f s f pl x' -> 's m e f' at 8 'x s f s f x' -> 's f' at 3