我需要使用正則表達式從以下行中提取第四個字段值(128)。Perl中的正則表達式
('29/11/2010 09:38:05', '41297', '29/11/2010 09:40:30', '128', '17', 'SUCCESS', '30', 'e', '9843171457', '1', '-1')
請告訴我採取第四個值的方法。
在此先感謝。
我需要使用正則表達式從以下行中提取第四個字段值(128)。Perl中的正則表達式
('29/11/2010 09:38:05', '41297', '29/11/2010 09:40:30', '128', '17', 'SUCCESS', '30', 'e', '9843171457', '1', '-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";
蠻力方式:
/'[^']*',\s*'[^']*',\s*'[^']*',\s*'([^']*)'/
這是一個報價,然後任意數量的非引號,然後又報價,逗號,和一些可選的空白。所有這些重複四次,圍繞第四個值()
來捕捉它。如果允許值中包含引號,則這可能不起作用。
正如卡梅倫指出的那樣,你可以通過避免重複:
/(?:'[^']*',\s*){3}'([^']*)'/
的?:
告訴正則表達式解析器不捕獲括號內的東西。
使用split
以逗號作爲分隔符可能更容易將列表拆分,然後取第四個元素。當然,如果你可以在值中有逗號,那可能不起作用。
從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
能引號進行轉義?如果是這樣,怎麼樣? – Cameron
由於這是一個逗號分隔的帶引號的字符串,因此使用專門用來處理它的模塊是有意義的,而不是正則表達式或分割。請參閱下面的eugene的回答。 – TLP