[英]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]+) - (.*)
工作正則表達式示例:
火柴:
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);
關於風格的幾點說明:
$row
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.