我了解您希望 (1) 跳过不包含任何内容或不符合您的规范的行。(2) 如果它们是单元格的唯一内容,则捕获 16 个非空格字符。(3) 捕捉文字模式“user_id=”之后的 16 个非空格字符。
如果也可以捕获空格字符,如果它们遵循 " user_id=
" 文字,您可以在适当的位置更改\S
为。.
我的解决方案使用Text::CSV来处理处理 CSV 文件的细节。您可以这样做:
use strict;
use warnings;
use autodie;
use open ':encoding(utf8)';
use utf8;
use feature 'unicode_strings';
use Text::CSV;
binmode STDOUT, ':utf8';
my $csv = Text::CSV->new( {binary => 1} )
or die "Cannot use CSV: " . Text::CSV->error_diag;
while( my $row = $csv->getline( \*DATA ) ) {
my $column = $row->[0];
if( $column =~ m/^(\S{16})$/ || $column =~ m/user_id=(\S{16})/ ) {
print $1, "\n";
}
}
__DATA__
abcdefghijklmnop
user_id=abcdefghijklmnop
abcd fghij lmnop
randomdatAuser_id=abcdefghijklmnopMorerandomdata
user_id=abcd fghij lmnop
randomdatAuser_id=abcd fghij lmnopMorerandomdata
在您自己的代码中,您不会使用DATA
文件句柄,但我假设您已经知道如何打开文件。
CSV 是一种看似简单的格式。不要将其高可读性与解析简单性混淆。处理 CSV 时,最好使用经过充分验证的模块来提取列。其他解决方案可能无法使用嵌入引号的逗号、转义逗号、不平衡引号以及我们的大脑在运行中为我们修复的其他异常情况,但这会使纯正则表达式解决方案变得脆弱。