Regex 拆分以逗号分隔的列表,其中文本中的逗号不是';逃过
我使用的是传统数据,其格式通常为:Regex 拆分以逗号分隔的列表,其中文本中的逗号不是';逃过,regex,perl,Regex,Perl,我使用的是传统数据,其格式通常为: QID RESPONSE 但是,在某些情况下,响应包含多个不同类型的值: 01320 2,35,6,"warm" 我试过使用 my @dataRowAsList = split('\t', $_); my $questionID = $dataRowAsList[0]; my $response = substr($dataRowAsList[1],0,-2); my @thisResponse = split(',', $respo
QID RESPONSE
但是,在某些情况下,响应包含多个不同类型的值:
01320 2,35,6,"warm"
我试过使用
my @dataRowAsList = split('\t', $_);
my $questionID = $dataRowAsList[0];
my $response = substr($dataRowAsList[1],0,-2);
my @thisResponse = split(',', $response);
在相关案例中,将输出分为问题和响应,然后将每个响应分为组成部分
但我刚刚发现了这种情况:
01320 2,35,6,"warm,windy"
引号中的逗号不转义
有没有一种简洁的方法可以将其解析为组件
2
35
6
"warm,windy"
从字符串读取的快速用法示例:
#!/usr/bin/perl
use warnings;
use strict;
use feature qw/say/;
use Text::CSV;
my $str = q/01320 2,35,6,"warm,windy"/;
my $csv = Text::CSV->new({auto_diag => 2});
my @fields = split " ", $str, 2;
say '$fields[0] is ', $fields[0];
say '$fields[1] is ', $fields[1];
say 'Parsed out $fields[1] is:';
$csv->parse($fields[1]);
say for $csv->fields;
运行此操作将产生:
$fields[0]是01320
$fields[1]是2,35,6,“温暖,有风”
解析出的$fields[1]是:
2.
35
6.
温暖的,多风的
这是一个非核心模块,因此您必须使用您喜爱的CPAN客户端或操作系统的软件包管理器安装它。如果这样做不能自动安装,您可能也希望这样做,以获得一个优化的实现,该实现带有自动使用(如果存在)的
Text::CSV
。在您的情况下,我将使用regexp并检查我需要的组,这是一个示例,我希望它能帮助您
use warnings;
use strict;
my $string = '01320 2,35,6,"warm,windy"';
if ($string =~ /^(\d+)\t(\d+),{1}(\d+),{1}(\d+),{1}(\S+)$/gu) {
print "$1\n$2\n$3\n$4\n$5\n\n";
}
使用
Text::CSV
或其他CSV模块。