用于从封闭字符串中提取 IP 地址和端口的简单 Java 正则表达式

Posted

技术标签:

【中文标题】用于从封闭字符串中提取 IP 地址和端口的简单 Java 正则表达式【英文标题】:Simple Java regex to extract IP address and port from enclosing string 【发布时间】:2015-06-27 17:38:14 【问题描述】:

考虑一对IPv4IPv6 地址和端口,以/: 分隔,例如

10.10.10.10:1234

端口是可选的,所以字符串像

10.10.10.10/
10.10.10.10:
10.10.10.10

也是有效的。地址/端口对可能后跟空格或逗号字符,它是更长的封闭字符串的一部分。

什么是一个非常简单的正则表达式来从封闭字符串中提取单独字段中的 2 个值(不使用字符串操作函数)?

例如,像这样的表达式

(?<address>[^\s,]+[^\s,:\.])((/|:)(?<port>\d*))?

在同一个字符串中提取地址和端口。

这里的目标是使用最简单的正则表达式实现提取,即使它不是 100% 准确(即,即使它也匹配其他字符串)。

【问题讨论】:

如果简单又长没问题的话,勾选这个(无端口但可以追加)***.com/questions/23483855/… 为什么是正则表达式?常规的String 方法在这里更好 我见过很多这样的正则表达式,但正在寻找一个简单的。 :-) 【参考方案1】:

使用commons validator:

InetAddressValidator validator = InetAddressValidator.getInstance();
if (validator.isValid(ipAddress) 
   // cool, isn't valid

throw new InvalidAddressException(ipAddress);

【讨论】:

正则表达式不是这里的路,PNS。 他们是唯一的方法。正如我在问题中所说,地址/端口对是从长字符串中提取的,并且该长字符串还有其他需要提取的字段。因此,我要求的正则表达式将成为更长的正则表达式的一部分。【参考方案2】:
([0-9.]*)(\/|:)([0-9]*)

这是正则表达式。第一组给你IP。第三组为您提供端口号。中间组给出分隔符,即 / 或 : 用于交替。可以忽略。

【讨论】:

它适用于 IPv4,但不包括 IPv6。谢谢和 +1。 你能给我一个 IPv6 地址的样本吗? IPV6 地址包含数字 [0-9]、字母 [A-F] 和 : 符号,例如1234:ab8:46a3::2a8e:567:1234 是 IPv6 地址。 好的。是冒号数:固定在端口号冒号之前?即 4 ? 不,它可以是任何数字,从 0 到不少,你永远无法知道到底有多少。

以上是关于用于从封闭字符串中提取 IP 地址和端口的简单 Java 正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

从 sockaddr_storage 中提取 IP 地址和端口信息

正则表达式从字符串中提取 IP 地址 [重复]

正则表达式:使用 SED 从 XML 中提取 IP 和 IPv6 [重复]

用于测试多个地址和端口的 Bash 脚本 telnet

如何在 linux shell 中使用正则表达式从文件中提取 IP 地址?

Spring boot - 如何获取正在运行的端口和IP地址[重复]