2011-08-01 60 views
3

我在玩弄Perl並試圖更好地理解其子字符串/正則表達式功能。使用Perl返回子字符串正則表達式

說我有一個字符串,如

[48:31.8]發送:> 33 * 1311875297587 * EVAL * 0 *幀[0] * 「A」 <

和要返回1311875297587。它將始終以這種格式。我將如何使用Perl來做到這一點?

感謝

+1

描述如何識別感興趣的部分。長度至少爲3位數字的字符串?從「>」後面的第四個字符開始? 「* eval」之前的數字? etc ... – tadmc

回答

8

假設 「[48:31.8] ......」 在$字符串,則:如果字符串不匹配

my ($number) = $string =~ /\*(\d+)\*eval\*/; 

$number將是不確定的,否則會包含"*""*eval*"之間的數字。

+0

完美,謝謝! – Roger

+0

我會在'*'上分割'輸入,並根據子串號解析它。少一點黑客,更強大。 – kevlar1818

1
if ($str =~ /\*(\d+)\*/) { 
    print $1; 
} 
0

對於它的價值,我覺得這是一個更強大的答案:

while(<STDIN>) 
{ 
    @fields = split(/\*/,$1) if(/(?<=>)([^<>])+(?><)/); 
    print "$fields[1]\n"; 
} 

這允許訪問所有的字段,如果你需要它們,並且不依賴於固有爲了解析出一個特定的領域。

用你想要的任何逐行迭代代替while循環。對於測試,請將其作爲Perl腳本運行,然後粘貼[48:31.8] Sent: >33*1311875297587*eval*0*frame[0]*"A"<或其他任何內容。

1
my ($num) = '>33*1311875297587*eval*0*frame[0]*"A"<' =~ /(\d{3,})/; 
print $num; 
相關問題