Hombre, se puede crear un Parser... pero creo que es demasiado, para lo que dices, puede bastar con algo así:
Código Delphi
[-]
type
TCharSet = set of Char;
const Primera : TCharSet = ['D','C','P'];
Segunda:TCharSet = ['A'..'Z', 'Ñ'];
numeros:TCharSet = ['0'..'9'];
Ultima :TCharSet = ['A','B','C','E','J','N',' '];
function IsIDFactura(const str:string):Boolean;
var s:string;
begin
Result := length(str) = 8;
s := uppercase(str);
if Result then
Result := (s[1] in Primera) and
(s[2] in Segunda) and
(s[3] in numeros ) and
(s[4] in numeros ) and
(s[5] in numeros ) and
(s[6] in numeros ) and
(s[7] in numeros ) and
(s[8] in Ultima );
end;
Ya tienes una idea, si quieres que se valide mientras se escribe, pues es cuestión de modificarlo.
Saludos