Perl中的正则表达式

时间:2011-07-27 12:55:00

标签: regex perl

我需要使用正则表达式从以下行中提取第4个字段值(128)。

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

请告诉我取第4个值的方法。

提前致谢。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

蛮力方式:

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

这是一个引号,后跟任意数量的非引号,然后是另一个引号,逗号和一些可选的空格。所有重复四次,()围绕第四个值捕获它。如果允许值包含引号,则这可能不起作用。

正如卡梅伦指出的那样,你可以避免重复:

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

?:告诉正则表达式解析器而不是捕获括号内的内容。

使用逗号作为分隔符,使用split分割列表可能更容易,然后取第四个元素。当然,如果您可以在值中包含逗号,则可能无效。

答案 2 :(得分: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";