Regex Perl中的正则表达式

Regex Perl中的正则表达式,regex,perl,Regex,Perl,我需要使用正则表达式从下一行中提取第四个字段值(128) ( '29/11/2010 09:38:05', '41297', '29/11/2010 09:40:30', '128', '17', 'SUCCESS', '30', 'e', '9843171457', '1', '-1') 请告诉我取第四个值的方法 提前感谢。这只是perl的“split”命令 暴力方式: /'[^']*',\s*'[^']*',\s*'[^']*',\s*'([^']*)'/ 这是一个引号,后跟任意数量的非

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

( '29/11/2010 09:38:05', '41297', '29/11/2010 09:40:30', '128', '17', 'SUCCESS', '30', 'e', '9843171457', '1', '-1')
请告诉我取第四个值的方法

提前感谢。

这只是perl的“split”命令

暴力方式:

/'[^']*',\s*'[^']*',\s*'[^']*',\s*'([^']*)'/
这是一个引号,后跟任意数量的非引号,然后是另一个引号、逗号和一些可选空格。在第四个值周围用
()
重复四次以捕获它。如果允许值中有引号,则这可能不起作用

正如Cameron指出的,您可以使用以下方法避免重复:

/(?:'[^']*',\s*){3}'([^']*)'/ 
?:
告诉regexp解析器不要捕获括号内的内容

使用
split
将列表拆分为逗号分隔符,然后使用第四个元素可能更容易。当然,如果可以在值中使用逗号,则可能无法使用。

从CPAN使用:

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

可以转义引号吗?如果是,怎么做?因为这是一个逗号分隔的字符串,带有引号,所以使用一个设计用于处理它的模块是有意义的,而不是正则表达式或拆分。请看下面尤金的答案。如果他保证有tic逗号tic,那么这是一个比逗号更好的分隔符。。。它无法去掉第一个和最后一个字段的开始和结束括号,但使命令非常简单,除非我缺少一些要求;)。这可以缩短为
/(?:“[^']*”,\s*){3}”([^']*)/
谢谢@Cameron-我已经用你的改进更新了我的答案。当我尝试这个时,我得到了一些填充,字符串是
“'128'
,例如,一个空格加上单引号。本打算检查是否有办法将其与模块分离,但现在这是您的答案。;)+非常好。下次我必须记住这一点,这样我才能打字更快由于这些值是用逗号分隔和引用的,所以使用模块是有意义的,比如。。。一切取决于他的要求。
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