Mine (borrowing RJK's testing code): $1 will be the last letter (non-underscore) before or at the target location; $2 will be the first letter at or after the target location, or the last letter if no such letter exists.
for (qw/ A_Z_K_ A_____ _____K /) { print "$_\n"; for my $n (1 .. 6) { my $r = $n - 1; print "$n: "; print /^(?=.{0,$r}([^_]))?.{0,$r}.*?([^_])/ ? "[$1] ($2)" : "no match"; print "\n"; } }