Perl正则表达式替换

时间:2018-06-14 19:34:03

标签: regex perl

我需要完全匹配"",而不是,"", 例如在这个字符串中

"abc","123","def","","asd","876"",345

我需要替换"",之后的"876",但仅在""之后留下"def"

我现在的正则表达式是

$line =~ s/[^,]"",/",/g

但是,这会替换6中的"876"

3 个答案:

答案 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" ;