IP地址validation的正则expression式

我想validation的值是有效的IP地址或不。

我用来validation像

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

它工作正常,但是当我给像12345678的值,它也返回true ..如何解决这个问题?

有一个更简单的方法。 你只需要分割string. 并检查每个数字是在0和255之间。

此外,您可以检查六进制和拆分:对于IPv6。


只因为我觉得这很有趣

 ^(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5]))\.(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5]))\.(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5]))\.(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5]))$ 

这是一个应该处理IP的正则expression式(v4)。

这适用于所有可能的情况。

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

为IPv4寻找一个,我最终只是自己创造。 (这只能处理常见的虚线variables,即0.0.0.0 – 255.255.255.255)

 ^ # START OF STRING (?=\d+\.\d+\.\d+\.\d+$) # Lookahead, require this format: number.number.number.number END OF STRING (?: # Start non-capture group (number 0-255 + optional dot) (?: # Start non-capture group (number 0-255) 25[0-5] # 250-255 | # OR 2[0-4][0-9] # 200-249 | # OR 1[0-9]{2} # 100-199 | # OR [1-9][0-9] # 10-99 | # OR [0-9] # 0-9 ) # End non-capture group \.? # Optional dot (enforced in correct positions by lookahead) ){4} # End non-capture group (number + optional dot), repeat 4 times $ # END OF STRING 

没有评论:

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

一些代码来testing它:

 function isValidIpv4Addr(ip) { return /^(?=\d+\.\d+\.\d+\.\d+$)(?:(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.?){4}$/.test(ip); } var testAddr = ['192.68.35.35','0.0.0.0','255.0.0.0','192.168.1.0','192.168.0.1','255.255.255.0','1.1.1.1','255.255.255.255','249.249.249.249','200.200.200.200','199.199.199.199','100.100.100.100','99.99.99.99','0.0.0.0','9.9.9.9','10.10.10.10','99.99.99.99','100.100.100.100','109.109.109.109','110.110.110.110','199.199.199.199','200.200.200.200','249.249.249.249','250.250.250.250','255.255.255.255','256.256.256.260','192.168.0.0/24','192.168..1','192.168.1','1','1.','1.1','1.1.','1.1.1','1.1.1.','1.1.1.1.','1.1.1.1.1','.1.1.1.1','01.01.01.01','09.09.09.09','1.0.0.1.0','010.1.1.1','123456','123123123123','.127.0.0.1']; for (var i = 0; i < testAddr.length; i++) { document.getElementById('ipv4tests').innerHTML += '<li>' + testAddr[i] + ' ' + (isValidIpv4Addr(testAddr[i]) ? '<font color="green">VALID!</font>' : '<font color="red">INVALID!</font>') + '</li>'; } 
 <ul id="ipv4tests"></ul> 

我知道这是旧的,但尝试这一个:

  /^(?:(?:2[0-4]\d|25[0-5]|1\d{2}|[1-9]?\d)\.){3}(?:2[0-4]\d|25[0-5]|1\d{2}|[1-9]?\d)(?:\:(?:\d|[1-9]\d{1,3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5]))?$/ 

我今天在php中做了一个函数。

它处理IP从0.0.0.0到255.255.255.255和端口从0到65535。

例子:

 validates: 0.0.0.0:0 255.0.0.0 192.168.1.0:8080 does not validate: 192.168.0.0/24 192.168..1 192.168.1 

我知道这是一个frankenregex,但它仍然有效!

如果端口不重要,使用这个:

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

这里是解决scheme:

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

你也可以试试这个:

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

我们希望模式重复四次 – 在这种情况下,我们的模式是一个0到255范围内的数字,前面是一个句点. 或string的开始! 由于string的开始只能出现一次,其他三次出现必须是句点。

请参阅这个正则expression式101演示,以获得完整的解释。

只需扩展@DavidFaber的优秀解决scheme。 匹配IPv4“ 点分十进制 ”符号(无范围/端口):

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

匹配示例: https //regex101.com/r/vX2hK4/15

编码高尔夫球员?

这个规矩运作良好,但相信我这是一个矫枉过正。
要像这里那样进行条件比较,最好是将RegEx和条件组合起来。

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

试试这个缩短的:

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

这是正则expression式的testing用例:

  function verifyIp(ip) { return /^(([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])(\.(?!$)|(?=$))){4}$/.test(ip||""); } ["192.68.35.35","0.0.0.0","255.0.0.0","192.168.1.0","192.168.0.1","255.255.255.0","1.1.1.1","255.255.255.255","249.249.249.249","200.200.200.200","199.199.199.199","100.100.100.100","99.99.99.99","0.0.0.0","9.9.9.9","10.10.10.10","99.99.99.99","100.100.100.100","109.109.109.109","110.110.110.110","199.199.199.199","200.200.200.200","249.249.249.249","250.250.250.250","255.255.255.255","256.256.256.260","192.168.0.0/24","192.168..1","192.168.1","1","1.","1.1","1.1.","1.1.1","1.1.1.","1.1.1.1.","1.1.1.1.1",".1.1.1.1","01.01.01.01","09.09.09.09","1.0.0.1.0","010.1.1.1","123456","123123123123",".127.0.0.1"].forEach(function(item){ is_valid = verifyIp(item); $('<div>'+item+' <span class="'+(is_valid?'correct':'wrong')+'">'+(is_valid?'VALID':'INVALID')+'</span></div>').appendTo('#result'); }); 
 .item { font-weight: bold; } .wrong { color: red; } .correct { color: green; } 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div id="result"></div> 

你可以简单地使用这个正则expression式来validation任何没有端口号的IP地址,如这种格式(192.168.1.1)

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

尝试这个,

 ValidIpAddressRegex = "^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$" 

试图缩短Grealy的版本

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

注意:正如以前的版本,这不能正确处理八进制数字,如0177.0.0.1

你也可以用我的给定expression式来检查,我已经检查并用java编写了一个程序来validationipv4地址。 如果Ipv4地址正确,则返回true,反之亦然。

String 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])$”

 import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.Scanner; class Solution{ public static void main(String []args){ Scanner in = new Scanner(System.in); while(in.hasNext()){ String IP = in.next(); System.out.println(IP.matches(new MyRegex().pattern)); } } } class MyRegex{ String 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]?\\dCongrats, you solved this challenge!\\d?|2[0-4]\\d|25[0-5])$"; } 

科林·赫伯特指出了最好的解决scheme。 但没有人通过提供代码来“解释”,所以在这里(“因为我觉得这很有趣”);

 var aIP = [ '192.168.0.1', '255.255.255.255', '1.2.34.647', '256.0.0.0', '255,0,0,0', '123.123.123', '1.2.3.4.5' ]; aIP.forEach(function(ipAddr) { var a = ipAddr.split('.'), cnt = 4; document.write('Testing ' + ipAddr + '<br/>'); try { a.forEach(function(v) { if( v<0 || v>255 ) throw false; cnt--; }); if( cnt!=0 ) throw false; cnt--; document.write('- Pass!<br/>'); } catch (e) { document.write('- Fail!<br/>'); } }); 

试试这个:

 (((?<![\d])([0-9][\.])|(?<![\d])([1-9][0-9][\.])|(?<![\d])(1[0-9]{2}[\.])|(?<![\d])(2[0-5][0-5][\.]))(([0-9][\.])|([1-9][0-9][\.])|(1[0-9]{2}[\.])|(2[0-5][0-5][\.])){2}(([0-9])(?![\d])|([1-9][0-9])(?![\d])|(1[0-9]{2})(?![\d])|(2[0-5][0-5])(?![\d]))) 

虽然这是一个5年的问题,所以我怀疑你还在寻找答案。

在另一个线程上发布更多信息: 使用正则expression式validationIPv4地址

这应该工作

 ^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$