我需要完全匹配"",
而不是,"",
例如在这个字符串中
"abc","123","def","","asd","876"",345
我需要替换"",
之后的"876"
,但仅在""
之后留下"def"
。
我现在的正则表达式是
$line =~ s/[^,]"",/",/g
但是,这会替换6
中的"876"
。
答案 0 :(得分:2)
使用团体替换:
$line =~ s/([^,])"",/$1",/g
或者是后视:
$line =~ s/(?<!,)"",/",/g
话虽如此,""
是引用的引用,它可以出现在字符串中。例如,这是有效的:"""abc"""
。为了避免破坏它,还要从后备中排除"
:
$line =~ s/(?<![,"])"",/",/g
答案 1 :(得分:0)
您正在尝试修复损坏的CSV文件。 使用模式匹配进行此操作并不是最佳解决方案。 您应该尝试使用 Text :: CSV_XS 模块修复它 allow_loose_quotes =&gt; 1 选项。
答案 2 :(得分:-1)
这会将损坏的col转换为空col并双引号最后一列。不太确定这是你想要的,但你去了。
use strict ;
my $line = '"abc","123","def","","asd","876"",345' ;
$line =~ s/\,{0,1}\"\"\,/\,\"\"\,/g ;
my @foo = split(/\,/,$line) ;
$foo[$#foo] =~ s/^|$/\"/g ;
$line = join ",", @foo ;
print "\n$line\n" ;