Update: I finally realized that $1 in the
(?(?{ $1 =~ tr/0-9// > 15 || $1 =~ tr/0-9// < 9 }) (*FAIL))
sub-pattern above can be replaced by $^N to eliminate one absolute back-reference. Using a named capture group does the trick for the remaining absolute capture, giving the regex below. (However, there may be a speed penalty associated with named captures – but I haven't Benchmark-ed this.)
my $ndn = qr{
# cannot begin after digit or any differentiator char.
(?<! \d) (?<! $diff)
# begin potential main pattern capture.
($d_min # begin main pattern group with minimum digits
(?<DIFF> $diff)? # group DIFF: possible differentiator char
# match to max number of digit(s)/single-diff groups.
(?: \d+ \k{DIFF} (?= \d)){0,9}
# end main pattern group capture with minimum digits.
$d_min) # end main group
# main pattern cannot be followed by a digit or...
(?! \d)
# ... by the diff char if any, else by any diff char.
(?(<DIFF>) (?! \k{DIFF}) | (?! $diff))
# qualify potential main pattern for min/max digits.
(?(?{ $^N =~ tr/0-9// < 9 || $^N =~ tr/0-9// > 15 }) (*FAIL))
}xms;