\b
not suitable for
(?:(?<!\w)(?=\w)|(?<=\w)(?!\w))
If you want to treat ~ as a word character, change \w to [\w~] .
(?:(?<![\w~])(?=[\w~])|(?<=[\w~])(?![\w~]))
Usage example:
my $word_char = qr/[\w~]/; my $boundary = qr/(?<!$word_char)(?=$word_char) |(?<=$word_char)(?!$word_char)/x; $key =~ /$boundary$match$boundary/
If we know that $match can only $match what starts and ends with $word_char , we can simplify the following:
my $word_char = qr/[\w~]/; my $start_bound = qr/(?<!$word_char)/; my $end_bound = qr/(?!$word_char)/; $key =~ /$start_bound$match$end_bound/
It is simple enough that we can embed.
$key =~ /(?<![\w~])$match(?![\w~])/
source share