this post was submitted on 15 Nov 2023
983 points (95.6% liked)

Programmer Humor

18961 readers
346 users here now

Welcome to Programmer Humor!

This is a place where you can post jokes, memes, humor, etc. related to programming!

For sharing awful code theres also Programming Horror.

Rules

founded 1 year ago
MODERATORS
 
you are viewing a single comment's thread
view the rest of the comments
[–] [email protected] 312 points 9 months ago (9 children)

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*$"

[–] [email protected] 106 points 9 months ago

Lord have mercy

[–] [email protected] 83 points 9 months ago* (last edited 9 months ago) (1 children)

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).

[–] [email protected] 11 points 9 months ago (2 children)

And dupe check. 0.0.0.0 and 000.000.000.000 may both be valid, but they resolve the same

[–] azertyfun 6 points 9 months ago (1 children)

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.

[–] [email protected] 6 points 9 months ago

some will parse 010 as 10, others as 0o10 == 8

...and that's me in the fetal position, thanks.

[–] [email protected] 3 points 9 months ago* (last edited 9 months ago) (3 children)

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)
[–] [email protected] 2 points 9 months 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.

[–] p1mrx 2 points 9 months ago (1 children)

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.

[–] [email protected] 2 points 9 months ago (1 children)

I don't know why anyone would write their IPs in octal, but fair point

[–] p1mrx 2 points 9 months ago

It's not about how people write them, it's how parsers parse them. IPv4 has been around since 1982, and most parsers interpret leading zeros as octal.

[–] [email protected] 51 points 9 months ago (5 children)

IPv6 was a mistake. We should have just added an addition octet

[–] [email protected] 75 points 9 months ago (4 children)

That would allow for like, 2 trillion devices? Feels like a bandaid, my dude. Next you’re gonna suggest a giant ice cube in the ocean once a year to stop global warming.

[–] [email protected] 13 points 9 months ago (1 children)

So add two more octets:

Moat companies will still just use something like 10.0.13.37.0.1

[–] [email protected] 11 points 9 months ago (2 children)

IPv6 is not made with internal networks in mind lol

[–] [email protected] 1 points 9 months ago

You can use a ULA if you want to. That's essentially the IPv6 equivalent of a private IP.

Why though? Having the same IP for both internal and external solves a bunch of issues. For example, you don't need to use split horizon DNS any more (which is where a host name has a different IP on your internal network vs on the internet). You just need to ensure your firewalls are set up properly, which you should do anyways.

[–] [email protected] -2 points 9 months ago (1 children)

Never claimed it was, please quote me where I said as much

[–] [email protected] 17 points 9 months ago (1 children)

My dude, you used the 10.xx private IP as an example. Why wouldn’t they assume you were referring to internal networks?

[–] [email protected] -2 points 9 months ago (1 children)

I thought it was pretty clear with me adding 13.37 that I was making a joke, the earlier post spoke about how just adding one octet would still be too few addresses, so I joked about adding one more octet.

[–] [email protected] 3 points 9 months ago

I’m only pointing out why the other poster would make the assumption you were referring to an internal network. Do with it what you will.

[–] [email protected] 9 points 9 months ago (1 children)
[–] [email protected] 6 points 9 months ago (1 children)

Hurricanes cannot cross the equator. The equator is an imaginary line, and hence has zero mass. We can end every hurricane using zero point zero energy (0.0).

[–] [email protected] 5 points 9 months ago (1 children)
[–] [email protected] 2 points 9 months ago
[–] [email protected] 4 points 9 months ago* (last edited 9 months ago)

You could follow this logic and add 2 alphanumeric digits before 4 numeric octets. E.g. xf.192.168.1.1

This would at least keep it looking like an IP and not a Mac address. Another advantage would be graceful ipv4 handling with a reserved range starting with "ip" like ip.10.10.10.1

[–] [email protected] 17 points 9 months ago (2 children)

Oh yeah, great, let's change the fundamental protocol on which all the networks in the world are based. Now two third of the devices in the world crashed because you tried to ping 192.168.0.0.1

[–] [email protected] 12 points 9 months ago

that WOULD be quite funny for the first second or 2....

[–] [email protected] 4 points 9 months ago

Could have sped up adoption significantly.

[–] [email protected] 6 points 9 months ago

They played us for absolute fools!

[–] [email protected] 1 points 9 months ago

IPv

heared of ipv5?

[–] [email protected] 1 points 9 months ago

Plus the MAC address

[–] [email protected] 37 points 9 months ago (1 children)
[–] Patches 19 points 9 months ago* (last edited 9 months ago) (1 children)

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

[–] [email protected] 9 points 9 months ago* (last edited 9 months ago) (2 children)

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 15 points 9 months ago* (last edited 9 months ago) (1 children)

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 4 points 9 months ago (1 children)

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.

[–] [email protected] 4 points 9 months 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.

[–] [email protected] 3 points 9 months ago

/.+(road|street).+/ resigns

[–] [email protected] 31 points 9 months ago

It's always a treat to debug a regex of that size.

[–] [email protected] 29 points 9 months ago

I knew there would be someone with the regex.

[–] [email protected] 18 points 9 months ago* (last edited 9 months ago)

You're more of a perl programmer than network engineer :P

[–] [email protected] 4 points 9 months ago (1 children)
[–] [email protected] 2 points 8 months ago

Technically, this one also matches everything:

[–] [email protected] 3 points 9 months ago* (last edited 9 months ago)

*exits the room*