需要Perl正则表达式分割帮助

时间:2014-01-21 17:37:08

标签: regex perl split

我正在尝试拆分这些记录

123.45.67.89/24 - String - Other string details (/25-/30)

包含3个包含"123.45.67.89","24""String - Other string details (/25-/30)"

的变量
#!/usr/bin/perl -w

use Data::Dumper;

$file = "Network_Usage.clean";

open (Network_Usage,$file);

while (<Network_Usage>) {
        chomp;
        my $row = $_;
        my @array = $row =~ /((([0-9]{1,3})\.{0,1}){4})\/([0-9]{1,2}) - (.*)/;
        print Dumper ( @array);
        exit;
}

close (Network_Usage);

但我得到了这个结果:

root@host:~/# ./split.pl 
$VAR1 = '123.45.67.89'; 
$VAR2 = '89'; 
$VAR3 = '89'; 
$VAR4 = '24'; 
$VAR5 = '';

如果它正在为我做这个工作的事件(我可以使用$VAR1,4,5)。我想知道在$VAR2/3收到结果我做错了什么。

5 个答案:

答案 0 :(得分:3)

我能找到的最简单的解决方案是限制结果,所以只让split()工作两次:

my @arr = split /[\/\s-]+/, $s, 3

它产生:

0  '123.45.67.89'
1  24
2  'String - Other string details (/25-/30)'

答案 1 :(得分:1)

您可以通过使用非捕获组使其无法捕获89两次。只需将?:添加到您不想捕获的组的开头即可。尝试将正则表达式更改为以下内容:

/((?:(?:[0-9]{1,3})\.{0,1}){4})\/([0-9]{1,2}) - (.*)/
   ^  ^

答案 2 :(得分:1)

这个正则表达式可行:

([0-9]{1,3}[\.]?[0-9]{1,3}[\.]?[0-9]{1,3}[\.]?[0-9]{1,3}[\.]?)\/([\d]+) - (.*)

工作正则表达式示例:

http://regex101.com/r/sC2uN3

匹配

MATCH 1
1.  `123.45.67.89`
2.  `24`
3.  `String - Other string details (/25-/30)`

答案 3 :(得分:1)

也许你可以在正则表达式匹配中使用它:

#!/usr/bin/perl

use warnings;
use strict;

my $t="123.45.67.89/24 - String - Other string details (/25-/30)";

if ($t =~ /(\d+\.\d+\.\d+\.\d+)\/(\d+)\s+(.*)/){
    print "$1\n"; #Prints "123.45.67.89"
    print "$2\n"; #Prints "24"
    print "$3\n"; #Prints "- String - Other string details (/25-/30)"
}

答案 4 :(得分:0)

如果-/始终是记录分隔符,您还可以使用split函数:

my $filename = "Network_Usage.clean";
open (my $network_file, '<', $file);

while (my $row = <$network_file>) {
        chomp;
        my @array = split /[\/\s-]/, $row; 
        print Dumper @array;
}

close($network_file);

关于风格的几点:

  1. 通常会在while条件中分配<{1}}
  2. 通常不鼓励使用BAREWORD文件句柄
相关问题