2011-07-27 39 views
0

我需要使用正則表達式從以下行中提取第四個字段值(128)。Perl中的正則表達式

('29/11/2010 09:38:05', '41297', '29/11/2010 09:40:30', '128', '17', 'SUCCESS', '30', 'e', '9843171457', '1', '-1') 

請告訴我採取第四個值的方法。

在此先感謝。

+1

能引號進行轉義?如果是這樣,怎麼樣? – Cameron

+1

由於這是一個逗號分隔的帶引號的字符串,因此使用專門用來處理它的模塊是有意義的,而不是正則表達式或分割。請參閱下面的eugene的回答。 – TLP

回答

1

這只是Perl的「拆分」命令

$str = ('29/11/2010 09:38:05','41297','29/11/2010 09:40:30','128','17','SUCCESS','30','e', '9843171457','1','-1'); 

@vars = split(/','/,$str); 
print "${vars[3]}\n"; 
+0

如果字符串內有引號,則這將不起作用 – Cameron

+1

由於值用逗號分隔和引用,因此使用模塊是有意義的,如[Text :: CSV](http://search.cpan.org/~ makamaka/Text-CSV-1.21/lib/Text/CSV.pm) – TLP

+0

同意......全部取決於他的要求。 – AndyMac

2

蠻力方式:

/'[^']*',\s*'[^']*',\s*'[^']*',\s*'([^']*)'/ 

這是一個報價,然後任意數量的非引號,然後又報價,逗號,和一些可選的空白。所有這些重複四次,圍繞第四個值()來捕捉它。如果允許值中包含引號,則這可能不起作用。

正如卡梅倫指出的那樣,你可以通過避免重複:

/(?:'[^']*',\s*){3}'([^']*)'/ 

?:告訴正則表達式解析器捕獲括號內的東西。

使用split以逗號作爲分隔符可能更容易將列表拆分,然後取第四個元素。當然,如果你可以在值中有逗號,那可能不起作用。

+0

如果他保證有tic-comma-tic,這是一個更好的分隔符,而不僅僅是逗號......它沒有去掉第一個和最後一個字段的開始和結束括號,但使得命令非常容易,除非我缺少一些要求;)。 – AndyMac

+1

這可以縮短爲'/(?:'[^'] *',\ s *){3}'([^'] *)'/' – Cameron

+0

謝謝@Cameron - 我已經更新了我的回答改進。 –

7

從CPAN使用Text::CSV

my $input = "('29/11/2010 09:38:05', '41297', '29/11/2010 09:40:30', '128', '17', 'SUCCESS', '30', 'e', '9843171457', '1', '-1')"; 

my $csv = Text::CSV->new({ 
    quote_char  => "'", 
    always_quote  => 1, 
    allow_whitespace => 1, 
}); 
$csv->parse($input); 
my @columns = $csv->fields(); 
print $columns[3], "\n"; # 128 
+0

當我嘗試這個時,我得到了一些填充,字符串是''''128''',例如一個空格加上單引號。要檢查是否有一種方法可以將模塊剝離,但現在是您的答案。 ;) – TLP

+0

@TLP:已修復,請參閱更新的版本。 –

+0

+1非常好。我必須記住下次,所以我可以更快地打字。 ;) – TLP