使用正则表达式验证IPv4地址

19 浏览
0 Comments

使用正则表达式验证IPv4地址

我一直在尝试使用有效的正则表达式进行IPv4验证,但运气不太好。似乎有一段时间我已经找到了 (25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?(\.|$)){4},但它产生了一些奇怪的结果:

$ grep --version
grep (GNU grep) 2.7
$ grep -E '\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?(\.|$)){4}\b' <<< 192.168.1.1
192.168.1.1
$ grep -E '\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?(\.|$)){4}\b' <<< 192.168.1.255
192.168.1.255
$ grep -E '\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?(\.|$)){4}\b' <<< 192.168.255.255
$ grep -E '\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?(\.|$)){4}\b' <<< 192.168.1.2555
192.168.1.2555

我搜索了一下,看看是否已经有人提出并回答了这个问题,但其他答案似乎只是展示如何确定4组1-3位数,或者对我来说不起作用。

0
0 Comments

使用正则表达式验证IPv4地址的有效性是一个常见的问题。在处理IPv4地址时,我们需要确保它符合以下要求:由四个由点分隔的数字组成,每个数字的范围是0到255。为了解决这个问题,我们可以使用正则表达式来匹配和验证IPv4地址。

在上面的内容中,我们可以看到作者提供了多个不同版本的正则表达式,用于验证IPv4地址的有效性。这些版本的目的是缩短正则表达式的长度,并提供更简洁的解决方案。作者通过使用不同的正则表达式技术和符号,例如捕获组、否定前瞻和量词等,来构建这些版本。

在这些版本中,最新、最短、最不可读的版本使用了最少的字符来验证IPv4地址的有效性。它使用了一些复杂的正则表达式技巧,例如负向前瞻和或运算,以匹配所有可能的情况。

另一个版本是一个较旧的、可读性较强的版本,它使用了一些较长的正则表达式来验证IPv4地址的有效性。它使用了捕获组和否定前瞻来确保地址的正确性。

在这些版本中,还提到了一些问题和改进的建议。例如,一些版本可能会接受一些无效的地址,或者不支持一些特定的正则表达式功能。作者根据这些建议进行了修改,并提供了更短、更简单的解决方案。

使用正则表达式来验证IPv4地址的有效性是一个常见的问题。通过选择合适的正则表达式技术和符号,我们可以构建一个简洁且有效的解决方案。然而,我们需要注意一些可能存在的问题,并根据实际需求进行修改和改进。

0
0 Comments

问题的出现原因是原始的正则表达式没有正确地验证IPv4地址。解决方法是添加括号以确保在进行选择时,点号(.)或行尾($)都是必需的。

下面是一个修正后的正则表达式的示例:'\b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4}\b'。这个正则表达式还可以验证类似于"192.168.1.1.1"这样的地址,所以我们需要对其进行改进。

改进后的正则表达式是:'\b((?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(?:(?

另一个可能的解决方法是使用这个正则表达式:((1?\d\d?|2[0-4]\d|25[0-5])\.){3}(1?\d\d?|2[0-4]\d|25[0-5])。这个正则表达式同样适用于非捕获,并且更加简洁。

如果要添加掩码,可以在IPv4地址的后面添加"/"和掩码。例如:25[0-5]|2[0-4][0-9]|[01][0-9][0-9]/[0-9]。在这种情况下,需要添加一个掩码的验证规则,确保它是有效的。

需要注意的是,有些IP地址可能会出现前导零的问题,例如"09.09.09.09"。虽然这个地址在正则表达式中匹配成功,但是在实际使用中可能会导致错误。因此,建议将匹配限制在点十进制表示法中。

此外,原始的正则表达式还可以验证一些不符合规范的情况,如"192.168.1.36.424.3232.1.0.3.0"、"192.168.32.1.424"、"9999.166.166.166.166"、"http://192.168.1.41"、".....0.....1.2.3.0"和"weird:10.0.0.0"。为了解决这个问题,可以将模式改为'^((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)(\.|$)){4}\b',以处理单个数字前导零的情况。

最后,还可以参考他人的回答来改进正则表达式,以处理更多边缘情况。例如:'(25[0-5]|2[0-4]\d|1?\d{0,2})\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)'。这个表达式对前导零和单个数字的处理更加准确。

0
0 Comments

验证IPv4地址的出现原因是需要判断给定的字符串是否符合IPv4地址的格式。解决方法是使用正则表达式进行匹配。

正则表达式为:^((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]?)$

其中,符合格式的IP地址被接受,不符合格式的IP地址被拒绝。

接受的IP地址示例:

- 127.0.0.1

- 192.168.1.1

- 192.168.1.255

- 255.255.255.255

- 0.0.0.0

- 1.1.1.01(这是一个无效的IP地址)

拒绝的IP地址示例:

- 30.168.1.255.1

- 127.1

- 192.168.1.256

- -1.2.3.4

- 1.1.1.1.

- 3...3

可以在https://www.debuggex.com/r/-EDZOqxTxhiTncN6/1上进行在线单元测试。

关于"3...3"这个IP地址是否被接受,可以使用这个正则表达式来匹配。

关于1.1.1.01这个IP地址是否被视为有效的IPv4地址,这个正则表达式将其视为有效的IPv4地址。可以在debuggex.com/r/-EDZOqxTxhiTncN6/1上进行在线单元测试。

另外,可以使用^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4}$的正则表达式得到相同的结果。可以在debuggex.com/r/mz_-0dEm3wseIKqK上进行在线测试,这个表达式与Byers的答案非常相似。

还有一个问题是你的简化版本不起作用。它将1.1.1.1.(注意末尾的点)识别为有效的IP地址。

对于1.1.1.00,这个正则表达式会出现错误的匹配。可以通过修改为(25[0-5]|2[0-4]\d|1?\d{0,2})\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))来提高匹配效果和速度。

0