How to validate IP address with regular expression

IP Address Regular Expression Pattern


^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.
([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])$

Description


^		#start of the line
 (		#  start of group #1
   [01]?\\d\\d? #    Can be one or two digits. If three digits appear, it must start either 0 or 1
		#    e.g ([0-9], [0-9][0-9],[0-1][0-9][0-9])
    |		#    ...or
   2[0-4]\\d	#    start with 2, follow by 0-4 and end with any digit (2[0-4][0-9]) 
    |           #    ...or
   25[0-5]      #    start with 2, follow by 5 and ends with 0-5 (25[0-5]) 
 )		#  end of group #2
  \.            #  follow by a dot "."
....            # repeat with 3 times (3x)
$		#end of the line

Whole combination means, digit from 0 to 255 and follow by a dot “.”, repeat 4 time and ending with no dot “.” Valid IP address format is “0-255.0-255.0-255.0-255”.

1. Java Regular Expression Example

IPAddressValidator.java

package com.mkyong.regex;

import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
public class IPAddressValidator{
	
    private Pattern pattern;
    private Matcher matcher;
 
    private static final String IPADDRESS_PATTERN = 
		"^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +
		"([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +
		"([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +
		"([01]?\\d\\d?|2[0-4]\\d|25[0-5])$";
	  
    public IPAddressValidator(){
	  pattern = Pattern.compile(IPADDRESS_PATTERN);
    }
	  
   /**
    * Validate ip address with regular expression
    * @param ip ip address for validation
    * @return true valid ip address, false invalid ip address
    */
    public boolean validate(final String ip){		  
	  matcher = pattern.matcher(ip);
	  return matcher.matches();	    	    
    }
}

2. IP address that matches :

1. “1.1.1.1”, “255.255.255.255”,”192.168.1.1″ ,
2. “10.10.1.1”, “132.254.111.10”, “26.10.2.10”,
3. “127.0.0.1”

3. IP address that doesn’t match :

1. “10.10.10” – must have 4 “.”
2. “10.10” – must have 4 “.”
3. “10” – must have 4 “.”
4. “a.a.a.a” – only digit has allowed
5. “10.0.0.a” – only digit has allowed
6. “10.10.10.256” – digit must between [0-255]
7. “222.222.2.999” – digit must between [0-255]
8. “999.10.10.20” – digit must between [0-255]
9. “2222.22.22.22” – digit must between [0-255]
10. “22.2222.22.2” – digit must between [0-255]

4. Unit Test

IPAddressValidatorTest.java

package com.mkyong.regex;

import org.testng.Assert;
import org.testng.annotations.*;
 
/**
 * IPAddress validator Testing
 * @author mkyong
 *
 */
public class IPAddressValidatorTest {
 
	private IPAddressValidator ipAddressValidator;
    
	@BeforeClass
        public void initData(){
		ipAddressValidator = new IPAddressValidator();
        }
    
	@DataProvider
	public Object[][] ValidIPAddressProvider() {
		return new Object[][]{
		   new Object[] {"1.1.1.1"},new Object[] {"255.255.255.255"},
                   new Object[] {"192.168.1.1"},new Object[] {"10.10.1.1"},
                   new Object[] {"132.254.111.10"},new Object[] {"26.10.2.10"},
		   new Object[] {"127.0.0.1"}
		};
	}
	
	@DataProvider
	public Object[][] InvalidIPAddressProvider() {
		return new Object[][]{
		   new Object[] {"10.10.10"},new Object[] {"10.10"},
                   new Object[] {"10"},new Object[] {"a.a.a.a"},
                   new Object[] {"10.0.0.a"},new Object[] {"10.10.10.256"},
		   new Object[] {"222.222.2.999"},new Object[] {"999.10.10.20"},
                   new Object[] {"2222.22.22.22"},new Object[] {"22.2222.22.2"},
                   new Object[] {"10.10.10"},new Object[] {"10.10.10"},	
		};
	}
	
	@Test(dataProvider = "ValidIPAddressProvider")
	public void ValidIPAddressTest(String ip) {
		   boolean valid = ipAddressValidator.validate(ip);
		   System.out.println("IPAddress is valid : " + ip + " , " + valid);
		   Assert.assertEquals(true, valid);
	}
	
	@Test(dataProvider = "InvalidIPAddressProvider",
                 dependsOnMethods="ValidIPAddressTest")
	public void InValidIPAddressTest(String ip) {
		   boolean valid = ipAddressValidator.validate(ip);
		   System.out.println("IPAddress is valid : " + ip + " , " + valid);
		   Assert.assertEquals(false, valid); 
	}	
}

5. Unit Test – Result


IPAddress is valid : 1.1.1.1 , true
IPAddress is valid : 255.255.255.255 , true
IPAddress is valid : 192.168.1.1 , true
IPAddress is valid : 10.10.1.1 , true
IPAddress is valid : 132.254.111.10 , true
IPAddress is valid : 26.10.2.10 , true
IPAddress is valid : 127.0.0.1 , true
IPAddress is valid : 10.10.10 , false
IPAddress is valid : 10.10 , false
IPAddress is valid : 10 , false
IPAddress is valid : a.a.a.a , false
IPAddress is valid : 10.0.0.a , false
IPAddress is valid : 10.10.10.256 , false
IPAddress is valid : 222.222.2.999 , false
IPAddress is valid : 999.10.10.20 , false
IPAddress is valid : 2222.22.22.22 , false
IPAddress is valid : 22.2222.22.2 , false
PASSED: ValidIPAddressTest([Ljava.lang.String;@1d4c61c)
PASSED: InValidIPAddressTest([Ljava.lang.String;@116471f)

===============================================
    com.mkyong.regex.IPAddressValidatorTest
    Tests run: 2, Failures: 0, Skips: 0
===============================================

===============================================
mkyong
Total tests run: 2, Failures: 0, Skips: 0
===============================================

Reference

  1. http://en.wikipedia.org/wiki/IP_address

About the Author

author image
mkyong
Founder of Mkyong.com, love Java and open source stuff. Follow him on Twitter, or befriend him on Facebook or Google Plus. If you like my tutorials, consider make a donation to these charities.

Comments

Leave a Reply

avatar
newest oldest most voted
Richard Yang
Guest
Richard Yang

Obviously, the digital starting with 0, like 09.012.38.128 also matches.

Why not this?

“^([0-9]|[1-9]\d|2[0-4]\d|25[0-5])\.” +
“([0-9]|[1-9]\d|2[0-4]\d|25[0-5])\.” +
“([0-9]|[1-9]\d|2[0-4]\d|25[0-5])\.” +
“([0-9]|[1-9]\d|2[0-4]\d|25[0-5])$”;

parth
Guest
parth

send me your full source code …

mbsysde99
Guest
mbsysde99

Thank you brother for sharing it. How to validate subnet mask? Anybody can help me?

Ludovic Urbain
Guest
Ludovic Urbain

Here’s the one I wrote for that purpose:
((1?dd?|2[0-4]d|25[0-5]).){3}(1?dd?|2[0-4]d|25[0-5])

tumba
Guest
tumba

Hi! Great forum, love the stuff here! I need help with this validator. How can I add to allow string “localhost”, too? Thank you!

Megha Thirwani
Guest
Megha Thirwani

Great document. Have seen so many tutorials online .. your’s is best

MKYING
Guest
MKYING

YO MKYONG! YOURE THE BEST!

V?n Ch??ng Nguy?n
Guest
V?n Ch??ng Nguy?n

This is regex 0-255: “^(([01]?\d{1,2})|(2[0-5]{0,2}))(\.(([01]?\d{1,2})|(2[0-5]{0,2}))){3}$”;

Akbar Ali
Guest
Akbar Ali

^(([01]?dd?|2[0-4]d|25[0-5])[.]?){4}$

yash
Guest
yash

can you please help me with IPv6 validation using regex, please ?? thanks.

yash
Guest
yash

404. link not found. :(

fetishes
Guest
fetishes

I am really inspired together with your writing abilities as smartly as with the format for your blog.

Is that this a paid topic or did you modify it yourself?
Anyway keep up the nice high quality writing, it is uncommon to peer a nice
weblog like this one these days..

Arsalan Khan
Guest
Arsalan Khan

How to make it fail for 255.255.255.255?

visit for names golden retriever content
Guest
visit for names golden retriever content

Excellent pieces. Keep posting such kind of information on your
site. Im really impressed by your blog.
Hi there, You have done a great job. I’ll certainly digg it and in my view suggest to my friends.

I’m confident they’ll be benefited from this web site.

king size memory foam mattress cover
Guest
king size memory foam mattress cover

No matter if some one searches for his necessary thing,
so he/she wishes to be available that inn detail, therefore that
thing is maintained over here.

microsoft points kopen
Guest
microsoft points kopen

Quality articles is the crucial to interest the visitors to go
to see the website, that’s what this site is providing.

irrationalimports.com
Guest
irrationalimports.com

After I initially left a comment I appear to have clicked on the -Notify me when new comments are added-
checkbox and now each time a comment is added I recieve four emails
with the exact same comment. Perhaps there is
a way you can remove me from that service? Many thanks!

Ferdinand
Guest
Ferdinand

Excellent blog here! Also your site lots up fast! What host
are you the usage of? Can I get your affiliate linnk on your host?
I want my website loaded up as fast as yours lol

raspberry pi alternative
Guest
raspberry pi alternative
I seldom leave a response, but i did a few searching and wound up here How to validate IP address with regular expression. And I do have a couple of questions for you if it’s allright. Could it be just me or does it give the impression like a few of these remarks come across as if they are written by brain dead folks? :-P And, if you are writing at other places, I would like to keep up with anything fresh you have to post. Could you make a list of the complete urls of all your shared sites… Read more »
Arpith
Guest
Arpith

Does not work for 10.106.2142 (2 digits and a 4-digit octet but it is still a valid IP; ping it if you will)

Abhideep
Guest
Abhideep

Does not work for 10.0.0.8 …

Anil
Guest
Anil

Thanks for posting this code – is it available for use freely? Appreciate your making it available.

Anil
Guest
Anil

Thanks for posting this code – is it available for use freely?

David Scherfgen
Guest
David Scherfgen

Nice article.
The question arises whether you want to use a very simple regex that will just look for four 3-digit numbers separated by dots and then filter the candidates in your programming language, or whether you want to use the quite complex one that has the “< 256" constraint built into it.
Would be interesting to see a performance comparison …

PS:
I also wrote an article about regex and IP addresses (IPv4 and IPv6).
IPv6 is so much easier to match because it uses hex numbers! :-)
http://regex-for.com/ip-addresses/

trackback
How to execute shell command from Java

[…] How To Validate IP Address With Regular Expression Tags : bash java mkyong Founder of Mkyong.com, love Java and open source stuffs. Follow him on Twitter, or befriend him on Facebook or Google Plus. Btw, Mkyong.com is hosted on Liquid Web, a perfect hosting provider, 100% uptime and 24 hours support. […]

nirmal
Guest
nirmal

Hi,
This program says 10.1.0.0 is a valid ip but this is not valid i believe, please see below link

http://www.comptechdoc.org/independent/networking/guide/netaddressing.html

Fikri Fadzil
Guest
Fikri Fadzil

10.1.0.0 is still a valid ip address.

.0 is used for network address.
.255 is used for broadcast address.

between both, all the addresses are used for hosts. whether the ip is valid or not… those are valid ip. Based on the URL you quoted from, 10.1.0.0 is not a valid host address because it is a network address.

ozgun
Guest
ozgun
IPAddressValidator ipAddressValidator; ipAddressValidator = new IPAddressValidator(); InetAddress address = null; boolean valid = ipAddressValidator.validate(“01.03.01.04”); System.out.println(“IPAddress is valid : ” + ” , ” + valid); try { address = InetAddress.getByName(“01.0.000.05”); } catch (UnknownHostException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. }
passerby
Guest
passerby
A string of digits beginning with 0 and including just digits 0-7 in an IPv4 address will be taken as an octal numeral, not a decimal numeral, in many contexts, such as the destination in a ping command. Mkyong’s pattern permits 2-digit & 3-digit strings beginning with 0. If the intention is to require a dotted quad of decimal unsigned integers, then multidigit strings beginning with 0 should not be permitted. Ozgun’s getByName approach is better. I think it will handle hostnames & all numeric-string IPv4 addresses, with 3, 2, 1, or 0 dots (4, 3, 2, or 1 unsigned-integer… Read more »
ozgun
Guest
ozgun

More easy way:
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
InetAddress address = null;
try {
address = InetAddress.getByName(“444.156.115.59”);
} catch (UnknownHostException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
java.net.UnknownHostException: 444.156.115.59
at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)

Szeak
Guest
Szeak

oh – \\. at the and sorry :)

Szeak
Guest
Szeak

Your pattern may like more pritty with this mode:

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

My pattern is :

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