0

让我们考虑一下我有以下字符串:

设置一个 {example192.168.0.1example10.0.0.1example172.16.0.1}

从上面的字符串中,我想使用正则表达式匹配 10.0.0.1?

对于第一个 ip,我们可以通过 regexp {.*?(\d+\.\d+\.\d+\.\d+)} $a match sub1

放 $sub1 =192.168.0.1

对于最后一个 IP,我们可以通过 regexp {.*?(\d+\.\d+\.\d+\.\d+)$} $a match sub1

放 $sub1 =172.16.0.1

对于第二个 IP,我们可以通过regexp {.*?(\d+\.\d+\.\d+\.\d+).*?(\d+\.\d+\.\d+\.\d+)} $a match sub1 sub2

放 $sub2 =10.0.0.1

  1. 这是使用正则表达式匹配第二个 ip 的任何简单格式吗?

  2. 例如,让我们考虑在一个字符串中我有 100 个 IP 地址,从这个字符串中我如何使用正则表达式匹配第 10 个 IP 地址

4

2 回答 2

1

尝试

% set a {example192.168.0.1example10.0.0.1example172.16.0.1}
example192.168.0.1example10.0.0.1example172.16.0.1
% set ipAddrs [regexp -inline -all {\d+\.\d+\.\d+\.\d+} $a]
192.168.0.1 10.0.0.1 172.16.0.1
% set ipAddr [lindex $ipAddrs 1]
10.0.0.1

请注意,Tcl 从 0 开始列出索引,因此要获得假设示例中的第 10 个 IP 地址,您需要[lindex $ipAddrs 9]

另外,我已经.*?从您的正则表达式模式中删除了前导和括号。似乎不需要明确匹配前导的非 IP 地址文本,并且括号导致每个 IP 地址在列表中出现两次,从而更难删除所需的地址。

于 2013-10-24T11:31:43.367 回答
0

您是否也只想检查 IP4 地址或 IPV6?这种情况下的正则表达式会很长,看起来像这样:

[list {(((25[0-5])|(2[0-4]\d)|(1\d\d)|(0?\d?\d))\.((25[0-5])|(2[0-4]\d)|(1\d\d)|(0?\d?\d))\.((25[0-5])|(2[0-4]\d)|(1\d\d)|(0?\d?\d))\.((25[0-5])|(2[0-4]\d)|(1\d\d)|(0?\d?\d))(/((3[0-2])|([1-2]?\d)))?)} \
                      {(((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?(/((12[0-8])|(1[0-1]\d)|(0?\d?\d)))?)}]
于 2013-11-08T10:04:17.870 回答