Expresión regular que valide números enteros y decimales de 1 o 3 digitos enteros y 1 o 3 digitos decimales

publicado por: Anonymous

Estoy tratando de crear una expresión regular en PHP que me valide números decimales los cuales deberían tener las siguientes reglas:

  1. Puede ser un número entero de 1 o 3 digitos sin decimales, ej. (1, 12, 123)
  2. Puede ser un número decimal donde su parte entera cumple la primera regla de la cantidad de digitos y su parte decimal igual, ej. (0.123, 0.2, 1.1, 1.0, 12.123, 123.1, 12.999)

Tengo la siguiente expresión:

/^[0-9]{1,3}?(.)?[0-9]{1,3}$/

Y la he probado de la siguiente manera:

$tests = [9.9, 99999.9, 123, 456, 1.1, 456.3, 12.899, "Hello World", 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0.123, 0.2, 1.0];
$pattern = "/^[0-9]{1,3}?(.)?[0-9]{1,3}$/";
foreach($tests as $test){
    $regexWorks = preg_match($pattern, $test);    
    echo($regexWorks === 1 ? $test . " OK<br/>" : $test . " NOT OK<br/>");    
}

Con los siguientes resultados, no soy muy bueno con las expresiones regulares y no sé que me falta o me sobra y ya he probado varios patrones y no me sirven

9.9 OK
99999.9 NOT OK
123 OK
456 OK
1.1 OK
456.3 OK
12.899 OK
Hello World NOT OK
1 NOT OK

2 NOT OK
3 NOT OK
4 NOT OK
5 NOT OK
6 NOT OK
7 NOT OK
8 NOT OK
9 NOT OK
0 NOT OK
0.123 OK
0.2 OK
1 NOT OK

solución

Prueba con la siguiente expresión regular:

(^[0-9]{1,3}$|^[0-9]{1,3}.[0-9]{1,3}$)

Se interpreta asi, tenemos dos grupos en esta expresion:

El primero es: ^[0-9]{1,3}$
Aquellas cadenas de numeros que comiencen y terminen con numeros y que su longitud sea de 1 a 3 caracteres.

El segundo es: ^[0-9]{1,3}.[0-9]{1,3}$
Aquellas cadenas de numeros que inicien con numeros de longitud de 1 a 3 caracteres,
que ademas le siga un punto y finalmente termine con numeros de longitud de 1 a 3 caracteres.

El simbolo “|” significa “O”.
Quiere decir que si la expresion no cumple con el primer grupo de expresión entonces intentará matchear
con el segundo.

Y esta combinacion “.” es para que reconozca al caracter (punto) en la expresión.
Ya que de dejarse solamente el simbolo “.” sin la diagonal invertida, significa que reconocer cualquier caracter.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *