• FauxPseudo @lemmy.world
    link
    fedilink
    arrow-up
    316
    arrow-down
    4
    ·
    1 year ago

    Ok. This covers every ipv6 and ipv4 address.

    “^\s*((([0-9A-Fa-f]1,4}:){7}([0-9A-Fa-f]{1,4}:))|(([0-9A-Fa-f]{1,4:)6}(:[0-9A-Fa-f]{1,4}((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3)|:))|(([0-9A-Fa-f]1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2}):((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3)|:))|(([0-9A-Fa-f]1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})((:[0-9A-Fa-f]{1,4)?:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9]))3})):))|(([0-9A-Fa-f]{1,4:)3}(((:[0-9A-Fa-f]{1,4}){1,4})((:[0-9A-Fa-f]{1,4)0,2}:((25[0-5]2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3))|:))|(([0-9A-Fa-f]1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})((:[0-9A-Fa-f]{1,4)0,3}:((25[0-5]2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3))|:))|(([0-9A-Fa-f]1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})((:[0-9A-Fa-f]{1,4)0,4}:((25[0-5]2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3))|:))|(:(((:[0-9A-Fa-f]1,4}){1,7})((:[0-9A-Fa-f]{1,4)0,5}:((25[0-5]2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3))|:)))(%.+)?\s*$”

    • Danny M@lemmy.escapebigtech.info
      link
      fedilink
      arrow-up
      85
      arrow-down
      2
      ·
      edit-2
      1 year ago

      Please don’t. Use regex to find something that looks like an IP then build a real parser. This is madness, its’s extremely hard to read and a mistake is almost impossible to spot. Not to mention that it’s slow.

      Just parse [0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3} using regex (for v4) and then have some code check that all the octets are valid (and store the IP as a u32).

        • azertyfun@sh.itjust.works
          link
          fedilink
          arrow-up
          6
          ·
          1 year ago

          Fuck that, if for whatever reason I’m writing an IP validator by hand I’m disallowing leading zeros. Parsers are very inconsistent, some will parse 010 as 10, others as 0o10 == 8 (you can try that right now with a POSIX ping). Talk about a footgun.

        • Danny M@lemmy.escapebigtech.info
          link
          fedilink
          arrow-up
          3
          ·
          edit-2
          1 year ago

          Definitely, tho if you store it as a u32 that is fixed magically. Because 1.2.3.4 and 1.02.003.04 both map to the same number.

          What I mean by storing it as a u32 is to convert it to a number, similar to how the IP gets sent over the wire, so for v4:

          octet[3] | octet[2] << 8 | octet[1] << 16 | octet[0] << 24

          or in more human terms:

          (fourth octet) + (third octet * 256) + (second octet * 256^2) + (first octet * 256^3)
          
          • p1mrx@sh.itjust.works
            link
            fedilink
            arrow-up
            2
            ·
            1 year ago

            Because 1.2.3.4 and 1.02.003.04 both map to the same number.

            But 10.20.30.40 and 010.020.030.040 map to different numbers. It’s often best to reject IPv4 addresses with leading zeroes to avoid the decimal vs. octal ambiguity.

          • Emma_Gold_Man@lemmy.dbzer0.com
            link
            fedilink
            arrow-up
            2
            ·
            1 year ago

            True enough for database or dictionary storage, but a lot of times things get implemented in arrays where you still wind up with two copies of the same uint32.

      • Patches@sh.itjust.works
        link
        fedilink
        arrow-up
        20
        ·
        edit-2
        1 year ago

        Made that joke in an interview once.

        They didn’t think it was funny. They truly thought Regex was the solution to, but never the cause of, all problems.

        They wanted to make a Regex to verify every single address in the world. Dodged a bullet

        • rob64@startrek.website
          link
          fedilink
          arrow-up
          9
          ·
          edit-2
          1 year ago

          Holy hell yeah you did. How would you go about doing that in a single expression? A bunch of back references to figure out the country? What if that’s not included? Oy.

          • Patches@sh.itjust.works
            link
            fedilink
            arrow-up
            16
            ·
            edit-2
            1 year ago

            You wouldn’t. It’s not possible. Which is what I told them.

            And why would you want to? Legally if you change the given address, and it fails to get delivered - that is on you. Not them.

            Some countries have addresses that are literally ‘Last house on the left by the Big Tree. Bumban(Neighborhood). NN (Country)’. Any US Centric validation would fail this but I assure you - mail gets delivered just fine.

            • azertyfun@sh.itjust.works
              link
              fedilink
              arrow-up
              4
              ·
              1 year ago

              The only valid regex is (.+). Maybe add a separate country field (especially because some Americans wholeheartedly believe that the entire world should understand that “foobar, TX” means “foobar, Texas, United States”) (don’t get me started on states whose abbreviations are also ISO country codes).

              Unfortunately I guess business people only care about getting fewer support calls for missing shipping details, not correctness or a couple of calls from customers who live in the boonies. Then the proper answer is a form with a bunch of fields… which Americans will inevitably fuck up by making the “State” field mandatory despite most countries not having an equivalent.

              What I’d really do is use one of those services that automatically fill on the address using google maps or whatever. Not perfect, probably not free, but a whole lot less work for presumably way fewer PEBCAKs from customers.

              • Natanael@slrpnk.net
                link
                fedilink
                arrow-up
                4
                ·
                1 year ago

                If you’re using one of those services then PLEASE allow manual entry / override because I’ve had forms like that which I were blocked from filing in because it didn’t acknowledge that my address existed.