use warnings; use strict; use 5.010; my $line = '*Mary* had a little lamb'; my $bagofwords = qr{had |a |Sam |Tom}; if ($line =~ s/\*([^*]+)\*\s*((?:$bagofwords)*)/*$1 $2* /) { say $line; } #### use v6; token word { had | a | Sam | Tom } say '*Mary* had a little lamb'.subst: rx{ '*' (<-[*]>+) '*' \s+ [ \s+]+ }, { '*' ~ join('_', $0, @($)) ~ '* ' };