Expressions regulars en grep

The site directory migrate module is currently enabled, unless you are doing the migration right now, there's no reason to leave it enabled.

He estat buscant una expressió regular amb el grep per a comprobar
si una ip es correcta. Al final m'he decidit per la següent.

echo 127.0.0.1 | grep '^[0-9]\{1,3\}[.][0-9]\{1,3\}[.][0-9]\{1,3\}[.][0-9]\{1,3\}$'
  • En la següent expressió regular els caracters ^ i $ signifiquen principi i final de linia
  • L'expressió [0-9] s'expandeix per tots el números del 0 al 9.
  • Amb l'expressió \{1,3\} aconsegueixes que es probe entre 1 i 3 voltres si quadra.
  • El . significa qualsevol caracter però si el poses entre brackets significa que s'ha
    de trobar 1 punt.
  • El caracter ^ dins de brackets significa també negació.
  • Si algú se li ocorre alguna opció més eficient per a comprobar IPs, jo he elegit
    aquesta perque és pràctica encara que no és del tot correcta, ja que no pot haver un 9 a principi
    de línia.

    Una vuelta de tuerca

    Con esto no dejas pasar valores superiores a 299 pero lo suyo seria 255.

    echo 127.0.0.1 | \
    grep '^[0-2][0-9]\{0,2\}[\.][0-2][0-9]\{0,2\}[\.][0-2][0-9]\{0,2\}[\.][0-2][0-9]\{0,2\}$'
    

    No dejan de sorprenderme

    Bueno, creo que esto es exactamente lo que buscas.

    Metes el rango de ips, en este caso 0.0.0.0/255.255.255.255 (todas las posibles) y le das al boton de generar expresiones regulares, mas facil imposible.

    Lo dicho, la gente de Google no deja de sorprenderme.

    regexps

    Melkor, la teua regexp més que per a IP's es per a quatre números separats per punts :P

    Gastant el programeta que comenta arrase eix:

    ^([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))\.
    ([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))\.
    ([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))\.
    ([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))$
    

    que es pot simplificar a:

    ^(([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))\.){3}
    ([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))$
    

    + simplificat

    Com a passatemps he simplificat un poc més, com se pot vore s'ha quedat en 103 caracters, inicialment tenia 220.

    jack$ echo -n '^(((([1-9]|1[0-9])?[0-9])|(2([0-4][0-9]|5[0-5])))\.){3}
    ((([1-9]|1[0-9])?[0-9])|(2([0-4][0-9]|5[0-5])))$'|wc -c
         103
    

    Si algú ho consegueix amb menys caracters que responga a este post amb la solució... jo crec que no es podrà simplificar més.

    Com a curiositat, mirant el códic font de la web que genera les regexp's se pot vore com ho fa gastant javascript (buscar les funcions IP, IPAll e IPGen).