如何使用给定字符串中的正则表达式匹配IP地址?

时间:2013-10-24 10:57:10

标签: regex tcl

让我们考虑以下字符串:

  

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

从上面的字符串我想用regexp匹配10.0.0.1?

  

我们可以通过regexp {.*?(\d+\.\d+\.\d+\.\d+)} $a match sub1

进行第一次ip      

将$ sub1 = 192.168.0.1

     

我们可以通过regexp {.*?(\d+\.\d+\.\d+\.\d+)$} $a match sub1

进行最后一次ip      

将$ sub1 = 172.16.0.1

     

我们可以通过regexp {.*?(\d+\.\d+\.\d+\.\d+).*?(\d+\.\d+\.\d+\.\d+)} $a match sub1 sub2

进行第二次ip      

将$ sub2 = 10.0.0.1

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

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

2 个答案:

答案 0 :(得分: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地址在列表中出现两次,使得删除所需地址变得更加困难。

答案 1 :(得分: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)))?)}]