簡體   English   中英

需要Perl正則表達式拆分幫助

[英]Perl regular expression split help needed

我正在嘗試分割這樣的記錄

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接收結果出錯了。

我能找到的最簡單的解決方案是限制結果,因此僅讓split()起作用兩次:

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

它產生:

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

您可以使用非捕獲組來避免兩次捕獲89 只需在您不想捕獲的組的開頭添加?: 嘗試將正則表達式更改為以下內容:

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

這個正則表達式可以工作:

([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)`

也許您可以在正則表達式匹配中使用它:

#!/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)"
}

如果-/始終是記錄分隔符,則還可以使用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條件分配$row
  2. 通常不建議使用BAREWORD文件句柄

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM