【问题标题】:Regex pulling IP and port from string正则表达式从字符串中提取 IP 和端口
【发布时间】:2015-12-23 15:10:44
【问题描述】:

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

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

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

字符串是:

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

显然我的正则表达式替换不起作用。谁能指出我需要如何编写正则表达式?我想从这两个字符串中提取:

255.255.255.255:8080

意味着正则表达式需要匹配任何不是那个字符串的东西,并且什么都不用替换它。

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

【问题讨论】:

  • 你为什么尝试s/(sip:)(;.*)//..如果你说出你的想法,那么我们可以指出错误的想法,这样 - 在我看来 - 你可以了解更多。

标签: regex perl


【解决方案1】:

您可以使用以下内容:

/((\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+)/;

【讨论】:

    【解决方案2】:

    这是一个使用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
    

    【讨论】:

      【解决方案3】:

      这不是防弹的,但这应该可以:

      my $test = 'sip:255.255.255.255:8080;transport=TCP';
      
      my ($ip) = $test =~ /(\d+\.\d+\.\d+\.\d+:\d+)/;
      
      print "$ip\n";
      

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

      $test = $ip;
      

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2018-07-18
          • 2015-06-27
          • 2015-12-17
          • 2015-09-19
          • 2014-08-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多