Matcha en ip-adress med posix extended regexp

I gårdagens post fanns ett regexp med för att matcha en ip-adress:

[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}

Detta regex skulle matcha allt från 0.0.0.0 till 999.999.999.999 och så kan man ju inte ha det 😛

Jag satte mig därför och filade lite till och så här långt har jag kommit

^[1-2]?[0-9]?[0-9]\.[1-2]?[0-9]?[0-9]\.[1-2]?[0-9]?[0-9]\.[1-2]?[0-9]?[0-9]$

Det skulle matcha allt från 0.0.0.0 till 299.299.299.299 så det är fortfarande inte helt bra eftersom man bara vill matcha allt mellan 0.0.0.0 och 255.255.255.255. Utmaningen här är att få in allt i ett regex, det skulle vara lätt att åtgärda genom t.ex. en loop. Finns det nån som har ett bra tips så lämna gärna en kommentar.

EDIT:

Med Mekaniserad apelsins hjälp står nu svaret klart:

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

11 comments on this post.
  1. nikke:

    Funkar inte:
    ^[1-2]?[0-9]?[0-9]\.[1-2]?[0-5]?[0-5]\.[1-2]?[0-5]?[0-5]\.[1-2]?[0-5]?[0-5]$

  2. micke:

    Nope, då kan du t.ex. match 299 på första oktetten men inte t.ex. 199 på de övriga. så 299.0.0.0 skulle funka men inte 199.199.199.199 vilket är en giltig adress.

    /Micke

  3. nikke:

    Fast :
    ^[1-2]?[0-5]?[0-5]\.[1-2]?[0-5]?[0-5]\.[1-2]?[0-5]?[0-5]\.[1-2]?[0-5]?[0-5]$

  4. micke:

    Fast där har du samma problem t.ex. 199 funkar inte. det blir roll over till 200 vid 155. Man skulle behöva en grupp typ [0-255] fast just det funkar då inte.

    /Micke

  5. Andreas Olsson:

    Jag har hört ryktas att IP-adresser även kan se ut på det här viset…

    2001:16d8:cc88:1001:223:aeff:feb1:b64

  6. micke:

    Nej Andol, det behöver man inte oroa sig för, iaf inte i Södertälje stadsnät 😉

    /Micke

  7. mekaniseradApelsin:

    ([1-9]?\d|1\d\d|2[0-4]\d|25[0-5]\.){3}([1-9]?\d|1\d\d|2[0-4]\d|25[0-5]){1}

    ?

  8. micke:

    Ser spännande ut, måste testas!

  9. micke:

    |-operatorn var förstås svaret, men jag fick ändra lite i syntaxen för att min bash skulle svälja det:

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

    /Micke

  10. Erik Johansson:

    {1,3} istället för {3} så du kan matcha ip adresser som: 127.1, 10.1 eller 192.168.1, för oss med många nullbytes i våra ip adresser (har själv bara 1st nolla).

  11. Mickes blogg · Dynamisk DNS med Cloudflare:

    […] ingen lagSubscribe to feed‹ Montera Motorola Xoom automatiskt med udev  •  Matcha en ip-adress med posix extended regexp ›Dynamisk DNS med Cloudflare2011-06-27 in GNU/Linux by micke | 1 commentCloudflare är en lösning […]

Leave a comment





*