用于检查 IP 地址的 JavaScript 正则表达式

IT技术 javascript regex string string-matching
2021-01-21 03:11:38

我有几个 IP 地址,例如:

  1. 115.42.150.37
  2. 115.42.150.38
  3. 115.42.150.50

如果我想搜索所有 3 个 ip 地址,我应该写什么类型的正则表达式?例如,如果我这样做115.42.150.*(我将能够搜索所有 3 个 IP 地址)

我现在可以做的是:/[0-9]{1-3}\.[0-9]{1-3}\.[0-9]{1-3}\.[0-9]{1-3}/但它似乎不能很好地工作。

谢谢。

6个回答

可能会迟到,但有人可以尝试:

有效 IP 地址示例

115.42.150.37
192.168.0.1
110.234.52.124

无效 IP 地址示例

210.110 – must have 4 octets
255 – must have 4 octets
y.y.y.y – only digits are allowed
255.0.0.y – only digits are allowed
666.10.10.20 – octet number must be between [0-255]
4444.11.11.11 – octet number must be between [0-255]
33.3333.33.3 – octet number must be between [0-255]

用于验证 IP 地址的 JavaScript 代码

function ValidateIPaddress(ipaddress) {  
  if (/^(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]?)$/.test(ipaddress)) {  
    return (true)  
  }  
  alert("You have entered an invalid IP address!")  
  return (false)  
}  
这很好用,我很感激你提供了一个完整的函数和例子,说明什么会/不会通过。
2021-03-17 03:11:38
很高兴我能帮上忙。享受编码!!
2021-03-19 03:11:38
@ErickBest 答案的可视化:jex.im/regulex/...
2021-03-19 03:11:38
你的正则表达式是我唯一能通过测试的。谢谢!
2021-03-31 03:11:38
您的解决方案不应允许 '012.012.012.012'
2021-04-13 03:11:38

试试这个,它是一个较短的版本:

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

解释:

^ start of string
  (?!0)         Assume IP cannot start with 0
  (?!.*\.$)     Make sure string does not end with a dot
  (
    (
    1?\d?\d|   A single digit, two digits, or 100-199
    25[0-5]|   The numbers 250-255
    2[0-4]\d   The numbers 200-249
    )
  \.|$ the number must be followed by either a dot or end-of-string - to match the last number
  ){4}         Expect exactly four of these
$ end of string

浏览器控制台的单元测试:

var rx=/^(?!0)(?!.*\.$)((1?\d?\d|25[0-5]|2[0-4]\d)(\.|$)){4}$/;
var valid=['1.2.3.4','11.11.11.11','123.123.123.123','255.250.249.0','1.12.123.255','127.0.0.1','1.0.0.0'];
var invalid=['0.1.1.1','01.1.1.1','012.1.1.1','1.2.3.4.','1.2.3\n4','1.2.3.4\n','259.0.0.1','123.','1.2.3.4.5','.1.2.3.4','1,2,3,4','1.2.333.4','1.299.3.4'];
valid.forEach(function(s){if (!rx.test(s))console.log('bad valid: '+s);});
invalid.forEach(function(s){if (rx.test(s)) console.log('bad invalid: '+s);});
允许子网怎么样?电话:192.168.1.10/24
2021-03-17 03:11:38
@migueloop 我没试过: ^(?!0)(?!.*\.$)((1?\d?\d|25[0-5]|2[0-4]\d)(\.|$)){4}(\/\d+)?$
2021-03-26 03:11:38
0.0.0.0 被认为是有效的
2021-04-06 03:11:38
我发现这个正则表达式将涵盖 ips 和子网。并确保它不允许在每个块中前导 0。/^(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])\.(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])(\/([1-2][0-9]|3 [0-2]|[0-9]))?$/
2021-04-11 03:11:38
在这种情况下,您可以省略负前瞻 (?!0)
2021-04-12 03:11:38

如果您使用的是 nodejs,请尝试:

require('net').isIP('10.0.0.1')

doc net.isIP()

我喜欢这个。这是最好的,尽管从技术上讲它并不能完全回答问题。易于使用且易于阅读。非常感谢!
2021-03-15 03:11:38
提取 isIP() 中使用的 REGEX stackoverflow.com/a/68104187/9387542
2021-03-21 03:11:38

你的正则表达式已经有几个问题:

首先,它包含点。在正则表达式中,点表示“匹配任何字符”,您只需要匹配一个实际的点。为此,您需要对其进行转义,因此在点前放置一个反斜杠。

其次,但您要匹配每个部分中的任意三位数字。这意味着您将匹配 0 到 999 之间的任何数字,这些数字显然包含许多无效的 IP 地址编号。

这可以通过使数字匹配更复杂来解决;该站点上还有其他答案解释了如何做到这一点,但坦率地说,这不值得付出努力-在我看来,最好将字符串按点分割,然后仅将四个块验证为数字整数范围——即:

if(block >= 0 && block <= 255) {....}

希望有帮助。

对,我的意思是不应该用它>=代替>因为 0 是有效的块值。
2021-03-22 03:11:38
恕我直言,这是一个很好的答案。不要试图用正则表达式做太多事情通常是一个好习惯。将此答案与其他答案进行比较,并考虑哪一个会产生最易读/最直观的代码。更具可读性的代码需要更少的时间来理解并且不容易出错。
2021-03-26 03:11:38
一个挑剔:不应该block >= 0吗?
2021-03-29 03:11:38
@DaveYarwood:IP 地址不能大于 255。
2021-04-10 03:11:38
不错的解决方案,但是“000”块呢?它们是有效的 ip 块吗?(例如:000.000.000.000)
2021-04-11 03:11:38

不要编写自己的正则表达式或复制粘贴!您可能不会涵盖所有边缘服务(IPv6,还有八进制 IP 等)。使用is-ip来自 npm

var isIp = require('is-ip');

isIp('192.168.0.1');

isIp('1:2:3:4:5:6:7:8');

将返回一个布尔值。

Downvoters:注意解释为什么使用积极维护的库比从网站复制粘贴更好?

OP 要求提供有效的 JS 解决方案。你只是假设 npm 可用。
2021-03-17 03:11:38
@rotem 我已按要求添加了链接。
2021-03-21 03:11:38
@mikemaccana,在浏览器中
2021-03-22 03:11:38
@masi npm 在哪里不可用?
2021-03-24 03:11:38
多年来,@elshev npm 一直是 Web 浏览器最常用的软件包来源。早在 2012 年使用 gulp+browserify,然后在 2015 年使用 webpack,现在使用 rollup。
2021-04-10 03:11:38