正则表达式:捕获变量中的条件
Regex : conditions in captured variables
这是我的数据(在文件中):
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 ( "" eq "" && "" ne "" ) {
print OUTFILE ";;;;;;;\n";
}
}
第1行和第2行匹配正则表达式,但不满足if
语句的条件。没关系。
另一方面,第 2 行和第 3 行满足正则表达式和 if
语句的条件。但是,这些行不会被检索到。
我想这是因为正则表达式读取了两行,然后是接下来的两行,依此类推。我认为我应该在正则表达式中包含 if
语句的条件(如果我没记错的话)。
大家怎么看?
变量 $data
保存我的 CSV 文件的内容。
由于您要检查第 1 行和第 2 行,然后是第 2 行和第 3 行,您需要通过放置正则表达式以匹配前瞻中的第二行来防止正则表达式引擎使用第二行:
while ( $data =~ m/(\d+);(Opt|Fab);(.+);(\d{2});(.+);(.+);(.+)\n(?=(\d+);(Opt|Fab);.+;\d{2};.+;(.+);(.+)\n)/g ) {
我第一次回答的时候并没有想太多,但是正如评论中@ThisSuitIsBlackNot 所建议的那样,使用正则表达式解析 CSV 会导致代码的可维护性较低。在这里使用 CSV 库解析数据并处理它们是一个更好的主意。
这是我的数据(在文件中):
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 ( "" eq "" && "" ne "" ) {
print OUTFILE ";;;;;;;\n";
}
}
第1行和第2行匹配正则表达式,但不满足if
语句的条件。没关系。
另一方面,第 2 行和第 3 行满足正则表达式和 if
语句的条件。但是,这些行不会被检索到。
我想这是因为正则表达式读取了两行,然后是接下来的两行,依此类推。我认为我应该在正则表达式中包含 if
语句的条件(如果我没记错的话)。
大家怎么看?
变量 $data
保存我的 CSV 文件的内容。
由于您要检查第 1 行和第 2 行,然后是第 2 行和第 3 行,您需要通过放置正则表达式以匹配前瞻中的第二行来防止正则表达式引擎使用第二行:
while ( $data =~ m/(\d+);(Opt|Fab);(.+);(\d{2});(.+);(.+);(.+)\n(?=(\d+);(Opt|Fab);.+;\d{2};.+;(.+);(.+)\n)/g ) {
我第一次回答的时候并没有想太多,但是正如评论中@ThisSuitIsBlackNot 所建议的那样,使用正则表达式解析 CSV 会导致代码的可维护性较低。在这里使用 CSV 库解析数据并处理它们是一个更好的主意。