Lately I just do mickey mouse lisp (and maybe in the past too).... anyway here is something, need more conditions.... HTH
;;(tst "x3x")
;;(tst "3x")
;;(tst "20.5,20.5,20.5x")
;;(tst "20.5,20.5,20.5cvcvcvcvcv")
;;(tst "20.5,20.5,20.5")
;;(tst "3cccccc1x")
;;(tst "xxxxxxxxxx31x")
;;(tst "xsadsadsadsadsadsadsa31x")
;;(tst "31x")
(defun tst (num)
(if (not (wcmatch NUM "*[]`~`['!%^&()+={}|`\\:;\"<>/]*"))
(cond
((wcmatch NUM "*x[0-9]*") nil)
((wcmatch NUM "[0-9]x") t)
((wcmatch NUM "[0-9]") t)
((wcmatch NUM "*[0-9]x") t)
((and (not (wcmatch NUM "*[a-z],*[A-Z]")) (wcmatch NUM "*[0-9]x")) t)
((and (wcmatch NUM "*[0-9]*")
(wcmatch NUM "*[`,`.]*")
(and (not (wcmatch NUM "*[a-z],*[A-Z]")) (not (wcmatch NUM "[a-z]*,[A-Z]*")))
)
t))))