Perl 如何使用正则表达式删除csv文件字符串中特定字段的前导空格和尾随空格

Perl 如何使用正则表达式删除csv文件字符串中特定字段的前导空格和尾随空格,perl,Perl,我们开始输入: X,XXXXX,XXXXXX, YYYYYY ,TTTTTTT,XXXXXXX,XXXXX XXXX Y,YYYYY,YYYYYY,YYY, XXXXXXX ,TTTTTT,XX XXXX,XX 我尝试了regex:s/\s//g,但是这个替换将替换字符串中任何地方的所有空白 请建议只修剪和跟踪整个字符串中特定字段的正则表达式 预期产出为: X,XXXXX,XXXXXX,YYYYYY,TTTTTTT,XXXXXXX,XXXXX XXXX Y,YYYYY,YYYYYY

我们开始输入:

X,XXXXX,XXXXXX,  YYYYYY ,TTTTTTT,XXXXXXX,XXXXX  XXXX
Y,YYYYY,YYYYYY,YYY, XXXXXXX    ,TTTTTT,XX XXXX,XX
我尝试了regex:
s/\s//g
,但是这个替换将替换字符串中任何地方的所有空白

请建议只修剪和跟踪整个字符串中特定字段的正则表达式

预期产出为:

X,XXXXX,XXXXXX,YYYYYY,TTTTTTT,XXXXXXX,XXXXX  XXXX
Y,YYYYY,YYYYYY,YYY,XXXXXXX,TTTTTT,XX XXXX,XX

删除该特定字段的前后空格。而且它不会干扰已经有空格的其他字段。

注意这或多或少与所示的字符串有关,字段内严格没有逗号

如果问题与一般CSV文件有关,请不要考虑正则表达式。使用模块解析文件并选择所需的字段。这是我想到的最重要的一点(您不希望

允许\u空白
用于您的目的)。还有很多,请搜索


捕获所有字段(带空格)作为非逗号字符

my @m = $string =~ /([^,]+)/g;
然后清理你想要的东西,然后加入他们

$m[2] =~ s/^\s+|\s+$//g;
$string = join '', @m;
注意:单独删除空格更快,
s/^\s+/;s/\s+$/


或者,对于修剪字段中没有多个单词的字符串

perl -Mstrict -wE'
    $_ = q( xxx ,   yyy ,hey,zz ,  aaa); say;
    my $N = 2;
    my $c; 
    s/(\s*([^, ]+)\s*)/++$c==$N ? $2 : $1/eg; say
'
印刷品

xxx , yyy ,hey,zz , aaa xxx ,yyy,hey,zz , aaa
这些都适用于
1..5

中的所有
$N
,因此我有两个可能的答案。一个使用
split
,只要您的CSV文件是“基本”的,就可以了-不带引号的逗号/换行符等

不过,这涵盖了大部分内容,因此我建议将其作为一个良好的起点

#!/usr/bin/env perl
use strict;
use warnings;


while ( <DATA> ) {    
   my @row = split /,/;
   s/^\s+// for @row;
   s/\s+$// for @row; 
   print join (",", @row),"\n";
}

__DATA__
X,XXXXX,XXXXXX,  YYYYYY ,TTTTTTT,XXXXXXX,XXXXX  XXXX
Y,YYYYY,YYYYYY,YYY, XXXXXXX    ,TTTTTT,XX XXXX,XX
使用
Text::CSV
您必须将其输入
STDIN
或将文件打开到您的CSV文件中。使用
split
可以使用


不过,这两种方法都不是真正的“regex”解决方案,因为这对于这项工作来说是完全错误的工具

您的预期输出是什么?您的“预期输出”与您的描述完全不一致,正则表达式不足以拆分csvfields@ysth嗯。。。当然——我考虑的是OP样式的字符串,而不是一般的CSV文件。否则正则表达式就没有意义了。@ysth-Right,谢谢你。。。他们确实说了“CSV文件”。。。谢谢你的回答。你能解释一下正则表达式吗;s/\s+$/@CodeSeek这两条语句中的第一条在字符串(
/^../
)的开头查找所有连续空格(
\s+
),并且不替换任何空格(
/../
)——因此它将删除它们。第二个在字符串的末尾找到所有连续的空格(
$
在regex中)并删除它们。谢谢Sobrique…它真的很有用。但我面临的另一个挑战是以comas结尾的输入数据,例如X,XXXXX,XXXXXX,YYYYYY,ttttttttt,XXXXXXX,xxxxxxxxx,,,,,,,,,,,,Y,yyyyyyy,yyyy,XXXXXXX,TTTTTT,XX XXXX,XX,,,,,,,,,,,我只想删除尾随和前导空格..拆分并连接回一行并不能完全给出我所期望的输出。我试图在输入字符串的末尾添加空格。请建议您是否有更好的解决方案
#!/usr/bin/env perl
use strict;
use warnings;


while ( <DATA> ) {    
   my @row = split /,/;
   s/^\s+// for @row;
   s/\s+$// for @row; 
   print join (",", @row),"\n";
}

__DATA__
X,XXXXX,XXXXXX,  YYYYYY ,TTTTTTT,XXXXXXX,XXXXX  XXXX
Y,YYYYY,YYYYYY,YYY, XXXXXXX    ,TTTTTT,XX XXXX,XX
#!/usr/bin/env perl
use strict;
use warnings;

use Text::CSV; 

my $csv = Text::CSV -> new (); 

while ( my $row = $csv -> getline ( \*DATA ) )  {    
   s/^\s+// for @$row;
   s/\s+$// for @$row; 
   print join (",", @$row),"\n";
}


__DATA__
X,XXXXX,XXXXXX,  YYYYYY ,TTTTTTT,XXXXXXX,XXXXX  XXXX
Y,YYYYY,YYYYYY,YYY, XXXXXXX    ,TTTTTT,XX XXXX,XX