Tcl 8.0.5, 344 (360 bytes)
set a ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
set s string
set x [join [lsort [split [$s toupper ABC321STPpJqZZr0] ""]] ""]
regsub -all (.)\\1+ $x \\1 x
set i 36
while {[incr i -1]} {set j -1
while {$i+[incr j]<36} {set y [$s range $a $j [expr $i+$j]]
regsub $y $x [$s index $y 0]-[$s index $y end],\ x}}
while {[regsub -all {(\w)(\w)} $x {\1, \2} x]} {}
puts $x
Tcl 8.0.5, 340 (356 bytes)
Tinkering with the rename
command yielded some fun tricks! I've documented them in another thread.
rename rename &
& set =
& regsub R
& string S
& while W
= a ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
= x [lsort [split [S toupper ABC321STPpJqZZr0] ""]]
R -all {(.) \1+| } $x \\1 x
= i 36
W {[incr i -1]} {= j -1
W {$i+[incr j]<36} {= y [S range $a $j [expr $i+$j]]
R $y $x [S index $y 0]-[S index $y end],\ x}}
W {[R -all {(\w)(\w)} $x {\1, \2} x]} {}
puts $x
Tcl 8.0.5, 332 (348 bytes) [Unstable—depends on $PATH]
info script ""
set tcl_interactive 1
set a ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
set x [lso [sp [st toupper ABC321STPpJqZZr0] ""]]
regs -all {(.) \1+| } $x \\1 x
set i 36
wh {[inc i -1]} {set j -1
wh {$i+[inc j]<36} {set y [st range $a $j [exp $i+$j]]
regs $y $x [st index $y 0]-[st index $y end],\ x}}
wh {[regs {(\w)(\w)} $x {\1, \2} x]} {}
pu $x
Credit to @JohannesKuhn for the interactive trick.