我使用Perl尝试从字符串中提取IP地址和端口。
我试图使用的正则表达式是:
s/(sip:)(;.*)//
字符串是:
sip:255.255.255.255:8080;transport=TCP
sip:255.255.255.255:8080
显然我的正则表达式替换不起作用。任何人都可以指出我需要如何编写正则表达式?从这两个字符串我想拉这个:
255.255.255.255:8080
这意味着正则表达式需要匹配任何不是该字符串的东西,并将其替换为任何字符串。
注意:每次IP地址和端口都不同。
答案 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/