I wish for that for a long time, but while a regular expression can definitively match, I haven't found a way to programmatically determine where the match fails. This is because a regular expression will try all alternatives and only after all of them have failed the entire regular expression has failed.
I think you could be clever and for any regular expression with a fixed length of atoms anchored to the start, you can tell where it fails, but any unanchored regex will simply fail "at the end" as that is the last position where it checks.
I also use Regexp::Debugger to find where a regexp fails to match. It is unwieldly if you construct your target regexp from variables, but I usually extract the offending regular expression (as string) and the target string into a separate file to check where things go sideways.