IP 地址验证的正则表达式

IT技术 javascript regex
2021-02-09 02:36:37

我想验证该值是否为有效的 IP 地址..!

我曾经验证过

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 .. 如何解决这个问题?

6个回答

有一个更简单的方法。您只需要拆分字符串.并检查每个数字是否在 0 到 255 之间。

此外,您可以检查 hexa 并拆分: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 (v4) 的正则表达式。

你将如何防止第一个数字为 0?
2021-03-19 02:36:37
我认为这个从你的版本中删除了冗余...... (?<!\S)((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\b|\.\b){7}(?!\S)
2021-04-02 02:36:37
@TJHeuvel,而且性能更高:)。正则表达式是一个有用的工具,但它是一个用于执行更复杂任务的大型引擎,因此在这里使用正则表达式就像使用火箭筒捕捉苍蝇一样。你可能会完成它,但代价是什么?
2021-04-08 02:36:37
这是一个很好的例子,正则表达式可以解析文本但无法理解它们的语义。您无法使用正则表达式轻松判断数字必须介于 0 和 255 之间,因为它无法仅理解数字文本。我会用 ([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+) 捕获正则表达式并在没有正则的情况下验证它表达
2021-04-10 02:36:37
他们不必是巨大的。我敢打赌你的代码比一个好的正则表达式要长。
2021-04-13 02:36:37

为 IPv4 寻找一个,我最终只是自己创建了它。(这仅处理常见的虚线变体,即 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}$

一些代码来测试它:

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>

优秀的文章解释了正则表达式的作用。这是一个基于您的正则表达式,它也将匹配 CIDR 表示法(不完美,但足够接近):^(?=\d+\.\d+\.\d+\.\d+(\/\d+)?$)(?:(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.?){4}(?:\/(?:[0-9]|1[0-9]|2[0-9]|3[0-2]))?$
2021-04-04 02:36:37

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

^(([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)$
我通常不信任那些声称在所有可能的情况下都有效的东西你运行了无限测试吗?或者推导出数学证明?但是,在这种情况下,我认为这实际上是最好的解决方案,并且可能在所有情况下都能正常工作:)
2021-03-16 02:36:37
.The 2[0-5][0-5] 部分可以修改为 25[0-5] 因为 2[0-4]\d 匹配从 200 到 249 的所有内容。你的答案的一个更短的版本是 ^(([1-9]?\d|1\d\d|25[0-5]|2[0-4]\d)\.){3}([1-9]?\d|1\d\d|25[0-5]|2[0-4]\d)$很好的答案,顺便说一句。
2021-03-25 02:36:37
这是对这个正则表达式的一些测试的小提琴,以证明它有效:refiddle.com/27uu
2021-04-02 02:36:37

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

    /^(?:(?: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 中的一个函数做了它。

它处理从 0.0.0.0 到 255.255.255.255 的 ip 和从 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)$/
@DavidG 不客气。如果您看到任何可以改进的地方,请在此处发表评论。
2021-03-15 02:36:37
伙计,非常好的工作!在正确匹配此测试regex101.com/r/vX2hK4/14的四个答案中,您的答案是迄今为止性能最高的!jsperf.com/js-regex-ip-address(让我的回答蒙羞)
2021-03-22 02:36:37
@NickG我从来不知道,正则表达式可能是THAT快!oO 我也会添加没有端口号的版本。我将在不同的浏览器和系统上测试它。并感谢您花时间编写测试用例。
2021-03-27 02:36:37

试试这个缩短的:

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

这是此正则表达式的测试用例:

  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>