in reply to Matching an IP address

4 == grep {$_<256} /^(\d+)[.](\d+)[.](\d+)[.](\d+)$/

Note that 0 is a valid value (unlike certain Microsoft programers thought). 10.0.0.1 is a perfectly fine IP address, for example. You can "golf" this by swapping \. for [.] but I think that mostly just makes it harder to read.

Also note that you might want to outlaw leading zeros since some C programs will incorrectly interpret 10.011.012.013 as containing 3 octal values and won't allow 10.08.09.10 since "08" and "09" aren't valid octal numbers.

4 == grep {$_<256&&!/^0\d/} /^(\d+)[.](\d+)[.](\d+)[.](\d+)$/

Replies are listed 'Best First'.
RE: RE: Matching an IP address
by BlueLines (Hermit) on Aug 02, 2000 at 01:19 UTC
    just outta curiosity, since the only check for a match is a number less than 256, wouldn't something like -1003.4.-23.0 match?

    BlueLines

    Disclaimer: This post may contain inaccurate information, be habit forming, cause atomic warfare between peaceful countries, speed up male pattern baldness, interfere with your cable reception, exile you from certain third world countries, ruin your marriage, and generally spoil your day. No batteries included, no strings attached, your mileage may vary.

      No, because "-" is not a digit and the regex only matches digits. When I first typed the code in, I also checked for -1<$_, but later I realized that wasn't needed. Here is another try:

      1111==join"",map{/^\d+$/&&$_<256&&!/^0\d/?1:2}split/[.]/

      Update: I played about 8 rounds of golf on this before posting and managed to drop ,$_,-1, so the above doesn't reject trailing dots.