正则表达式:捕获变量中的条件

时间:2015-01-09 17:59:04

标签: regex perl expression conditional-statements

这是我的数据(在文件中):

5807035;Fab;2015/01/05;04;668100;18:06:01,488;18:06:02,892
5807028;Opt;2015/01/05;04;836100;17:12:45,223;17:12:47,407
5807028;Fab;2015/01/05;04;836100;17:12:47,470;17:12:48,172
5807027;Opt;2015/01/05;04;926100;17:12:31,807;17:12:34,365
5807027;Fab;2015/01/05;04;926100;17:12:34,443;17:12:37,095
5807026;Opt;2015/01/05;04;682100;17:12:11,698;17:12:19,062
5807026;Fab;2015/01/05;04;682100;17:12:19,124;17:12:21,667
5807025;Opt;2015/01/05;04;217100;17:12:00,669;17:12:02,635

这是我的Perl代码:

while ( $data =~ m/(\d+);(Opt|Fab);(.+);(\d{2});(.+);(.+);(.+)\n(\d+);(Opt|Fab);.+;\d{2};.+;(.+);(.+)\n/g ) { 

    if ( "$1" eq "$8" && "$2" ne "$9" ) {
        print OUTFILE "$1;$3;$4;$5;$6;$7;$10;$11\n";
    }
}

第1行和第2行与正则表达式匹配,但不满足if语句的条件。没关系。

另一方面,第2行和第3行满足正则表达式和if语句的条件。但是,这些行未被检索。

我想这是因为正则表达式读取了两行,然后接下来的两行等等。我想我应该在正则表达式中包含if语句的条件(如果我没有弄错的话)。

你们有什么想法?

变量$data包含我的CSV文件的内容。

1 个答案:

答案 0 :(得分:1)

因为你想检查1号线和1号线。 2,然后2& 3,你需要通过将正则表达式放在匹配第二行来防止正则表达式引擎消耗第二行:

while ( $data =~ m/(\d+);(Opt|Fab);(.+);(\d{2});(.+);(.+);(.+)\n(?=(\d+);(Opt|Fab);.+;\d{2};.+;(.+);(.+)\n)/g ) {

当我第一次回答时,我没有想太多,但是@ThisSuitIsBlackNot在评论中没有提到,使用正则表达式来解析CSV导致可维护性代码较低。使用CSV库来解析数据并处理它们是一个更好的主意。