PDA

Ver la Versión Completa : validar patron para cuenta ordenante en recibo electronico de pago


gmontes
15-09-2018, 22:31:00
saludos

en el recibo electronico de pago del sat de mexico tiene este patron para capturar el numero de cuenta

[0-9]{10,11}|[0-9]{15,16}|[0-9]{18}|[A-Z0-9_]{10,50}

alguna forma de validar el campo cuenta para que cumpla con estos requisito

no se me ocurre nada, y por mas que busco lo unico que encuentro es el manejo de expresiones del cual no se utilizar :(

segun entiendo es: de 10 y 11 de longitud es numerico, de 15 y 16 numerico etc de 10 y 50 caracteres pueden se numero, letras y espacios

cualquier sugerencia, pista se agradecera.

duilioisola
17-09-2018, 10:13:39
La barra significa que debe cumplir alguna de las condiciones.
Entre corchetes están los caracteres válidos.
Entre llaves está cuantas veces se puede repetir uno de esos caracteres.


Por lo tanto, si quieres hacelo a mano, deberás comprobar estas cuatro expresiones. Si alguna es válida, entonces el patrón es válido


[0-9]{10,11} - 10 a 11 caracteres numéricos.
[0-9]{15,16} - 15 a 16 caracteres numéricos.
[0-9]{18} - 18 caracteres numéricos.
[A-Z0-9_]{10,50} - 10 a 50 caracteres alfanuméricos o el guión bajo.


Prueba esto:

function ExpresionValida (s : string) : boolean;
var
i : integer;
begin
// Asumo que es válido
Result := True;

// Si es una de las tres primeras opciones, compruebo que sean solo numeros
if ((Length(s) = 10) or (Length(s) = 11) or (Length(s) = 15) or (Length(s) = 16) or (Length(s) = 18)) then
begin
// Recorro la cadena
for i := 1 to Length(s) do
begin
// Si no es un número, la cadena no cumple los requisitos
if not (s[i] in ['0'..'9']) then
Result := False;
end;
end;

// Si no cumple con las expresiones regulares anteriores compruebo la cuarta opción.
if (not Result) then
begin
// Debe tener entre 10 y 50 caracteres
if ((Length(s) >= 10) or (Length(s) <= 50)) then
begin
for i := 1 to Length(s) do
begin
// Debe ser una letra mayúscula o un número o el guión bajo.
if ((not (s[i] in ['A'..'Z'])) or (not (s[i] in ['0'..'9'])) or (s[i] = '_')) then
Result := False;
end;
end
else
Result := False;
end;
end;

duilioisola
17-09-2018, 10:53:26
He corregido algunos errores después de probarlo.

function ExpresionValida (s : string) : boolean;
var
i : integer;
begin
// Asumo que no es válido
Result := False;

// Si es una de las tres primeras opciones, compruebo que sean solo numeros
if ((Length(s) = 10) or (Length(s) = 11) or (Length(s) = 15) or (Length(s) = 16) or (Length(s) = 18)) then
begin
Result := True;
// Recorro la cadena
for i := 1 to Length(s) do
begin
// Si no es un número, la cadena no cumple los requisitos
if not (s[i] in ['0'..'9']) then
Result := False;
end;
end;

// Si no cumple con las expresiones regulares anteriores compruebo la cuarta opción.
if (not Result) then
begin
// Debe tener entre 10 y 50 caracteres
if ((Length(s) >= 10) and (Length(s) <= 50)) then
begin
Result := True;
for i := 1 to Length(s) do
begin
// Debe ser una letra mayúscula o un número o el guión bajo.
if ((not (s[i] in ['A'..'Z'])) and (not (s[i] in ['0'..'9'])) and (s[i] = '_')) then
Result := False;
end;
end;
end;
end;



[2018-09-17 10:53:07.856] 123456789 Valido False
[2018-09-17 10:53:07.856] 1234567890 Valido True
[2018-09-17 10:53:07.856] 12345678901 Valido True
[2018-09-17 10:53:07.856] 123456789012 Valido True
[2018-09-17 10:53:07.856] 1234567890123 Valido True
[2018-09-17 10:53:07.856] 12345678901234 Valido True
[2018-09-17 10:53:07.856] 123456789012345 Valido True
[2018-09-17 10:53:07.856] 1234567890123456 Valido True
[2018-09-17 10:53:07.856] 12345678901234567 Valido True
[2018-09-17 10:53:07.856] 123456789012345678 Valido True
[2018-09-17 10:53:07.856] 1234567890123456789 Valido True
[2018-09-17 10:53:07.866] 12345678901234567890 Valido True
[2018-09-17 10:53:07.866] A23456789 Valido False
[2018-09-17 10:53:07.866] A234567890 Valido True
[2018-09-17 10:53:07.866] A2345678901 Valido True
[2018-09-17 10:53:07.866] A23456789012 Valido True
[2018-09-17 10:53:07.866] A234567890123 Valido True
[2018-09-17 10:53:07.866] A2345678901234 Valido True
[2018-09-17 10:53:07.866] A23456789012345 Valido True
[2018-09-17 10:53:07.866] A234567890123456 Valido True
[2018-09-17 10:53:07.866] A2345678901234567 Valido True
[2018-09-17 10:53:07.866] A23456789012345678 Valido True
[2018-09-17 10:53:07.866] A234567890123456789 Valido True
[2018-09-17 10:53:07.866] A23456789012345678901234567890123456789012345678901 Valido False

Casimiro Notevi
17-09-2018, 11:09:41
^\||/^\||/^\||/

gmontes
13-10-2018, 04:08:52
gracias, lo estoy utilizando ya.


y me da una muy buena direccion para implementar las demas validaciones.

^\||/^\||/^\||/