正则表达式从字符串中提取IP和端口

时间:2015-12-23 15:10:45

标签: regex perl

我使用Perl尝试从字符串中提取IP地址和端口。

我试图使用的正则表达式是:

s/(sip:)(;.*)//

字符串是:

  • sip:255.255.255.255:8080;transport=TCP
  • sip:255.255.255.255:8080

显然我的正则表达式替换不起作用。任何人都可以指出我需要如何编写正则表达式?从这两个字符串我想拉这个:

255.255.255.255:8080

这意味着正则表达式需要匹配任何不是该字符串的东西,并将其替换为任何字符串。

注意:每次IP地址和端口都不同。

4 个答案:

答案 0 :(得分:3)

您可以使用以下内容:

/((\d{1,3}.){3}\d{1,3}:\d+)/

说明:

(\d{1,3}\.){3}:连续1到3个数字,后跟连续3次 \d{1,3}:\d+:1到3个连续数字,后跟冒号后跟至少1位

所以在代码中它看起来像这样:

my $s = 'sip:255.255.255.255:8080;transport=TCP';
my ($socket) = $s =~ /((\d{1,3}.){3}\d{1,3}:\d+)/;

答案 1 :(得分:3)

这是一个使用Regexp::Common库来匹配IP地址的解决方案。

use 5.022;
use Regexp::Common qw/net/;

while (<DATA>){
    my @matches = ($_ =~ m/^sip:$RE{net}{IPv4}{-keep}:(\d+);?/);
    my $ip = $matches[0].':'. $matches[5];
    say $ip
}

__DATA__
sip:255.255.255.255:8080;transport=TCP
sip:255.255.255.255:8080

答案 2 :(得分:2)

这不是防弹的,但这应该有效:

my $test = 'sip:255.255.255.255:8080;transport=TCP';

my ($ip) = $test =~ /(\d+\.\d+\.\d+\.\d+:\d+)/;

print "$ip\n";

这只是提取它,当然......你总是可以这样取代它:

$test = $ip;

答案 3 :(得分:1)

正则表达式尝试匹配整个字符串,因为所需部分位于要删除的部分之间,因此该字符串不起作用。 所以你需要2个正则表达式来首先删除开始然后结束,或者你需要使用捕获组来获取你想要的部分,并像这样替换被捕获的部分(未检查正确性):

s/sip:(.*);.*/$1/