2012-05-24 32 views
1

給出以下兩行字符串,例如:正則表達式:從字符串|中提取3個特定數字例如

May 22 00:46:38.340 prod-lab03c-rd1 fpc4 XETH(4/2): %PFE-6: Link 0 XFP: Low Rx power warning set 
[May 24 11:24:28.299 LOG: Notice] MIC(0/1) link 1 SFP receive power low warning set 

我想在3個變量以下數字存儲:

[1] the 1st number after the "(", it could be 1 or more digits 
[2] the 1st number after the "/", it could be 1 or more digits 
[3] the first number after the "(L|l)ink" word, it could be 1 or more digits 

請你幫我在這嗎?

千恩萬謝

+0

什麼你在用什麼語言? – buckley

+0

SLAX是我正在使用的語言 – user690182

回答

3

爲了得到第(後的第一個數字,我們可以用.*\((\d+)。然後要獲得/之後的第一個數字,我們可以使用/(\d+)\)。然後在「鏈接」後獲得第一個數字:[lL]ink (\d+)。我們把這些結合在一起,以獲得

^.*\((\d+)/(\d+)\).*[lL]ink (\d+) 

的三個數字將是三組

1

這個作品在這裏

\((.*?)/(.*?)\).*?[Ll]ink (\d+) 

給你輸入它會給回

group 1 group 2 group 3 
4  2  0 
0  1  1 
0

在Perl的完整測試,例如:

#!/usr/bin/env perl 

use strict; 
use warnings; 

my @a; 

$a[0] = "May 22 00:46:38.340 prod-lab03c-rd1 fpc4 XETH(4/2): %PFE-6: Link 0 XFP: Low Rx power warning set\n"; 
$a[1] = "[May 24 11:24:28.299 LOG: Notice] MIC(0/1) link 1 SFP receive power low warning set"; 

foreach (@a) { 
    print "\$1=$1|\$2=$2|\$3=$3\n" if m!\((\d+)/(\d+)\).*?(?:L|l)ink\s+(\d+)!; 
} 

輸出:

$1=4|$2=2|$3=0 
$1=0|$2=1|$3=1