删除perl正则表达式中顽固的第一个字符串空格

时间:2012-07-16 20:45:57

标签: regex perl whitespace space

好的我正在尝试使用正则表达式从字符串的开头删除一个非常顽固的空间。 使用Text:CSV模块将此字符串从CSV文件解析为Perl,当我打印字符串的Dumper时,我得到:

$VAR1 = ' Mgmt-General-Other';  

现在我尝试使用Regex删除此空间,有人会告诉我使用:

$string =~ s/\s+$//;

我已经尝试过以及:

$string =~ s/\s//g;

$string =~ s/^\s//g;

并且这些都没有奏效,除了我想要的那个之外,中间的一个从所有东西中拉出来。我正在尝试遍历一个2,000行的CSV文件,所以我宁愿让它自动化,而不必为这个奇怪的实例做一个特殊的案例。

开头的这个角色有没有办法不是空格或白色空间?或者我该如何把它拿出来?

添加我尝试的更多内容;

$string =~ s/^\s+//;

这是我的代码:

my @value = @columns[1..12];
my $string = @value[9];
$string =~ s/^\s+//;
$string =~ s/\s+$//;
print Dumper $string;

如果重要,这些是我在剧本顶部的声明:

use strict;
use DBI;
use Getopt::Long;
use Spreadsheet::WriteExcel;
use Spreadsheet::WriteExcel::Utility;
use Data::Dumper;
use Text::CSV;

4 个答案:

答案 0 :(得分:10)

实际上你非常接近,因为在字符串的开头处替换空格的正确正则表达式是:

$sting =~ s/^\s+//;

至于其他解决方案:

$sting =~ s/\s+$//; # the same as 'rtrim', removes whitespace at the end of the string
$sting =~ s/\s//g;  # will just remove all whitespace
$sting =~ s/^\s//g; # will remove single whitespace symbol right at the beginning of the string.

更新:原来你的字符串中有一个\xA0(所谓的'不可破解的空白',它不包括在\s中)。 )试试这个:

$sting =~ s/^[\s\xA0]+//;

答案 1 :(得分:2)

这是一个事实的例子,不再是“只是一个字符串”

最简单的解决方案是确保您在正则表达式中使用unicode_strings语义。您可以通过以下几种方式实现这一目标。再说一次,为简单起见,您可以在脚本开头打开它:

use utf8;
use feature qw( unicode_strings );
binmode STDOUT, ':utf8';

my $string
    = join '', map { chr } ( 160,  77, 103, 109, 116,  45,
                              71, 101, 110, 101, 114,  97,
                             108,  45,  79, 116, 104, 101,
                             114 );

print $string, "\n";

$string =~ s/^\s+//;

print $string, "\n";

另一种方法是为处理Unicode字符串的特定正则表达式打开unicode_strings语义:

use utf8;
binmode STDOUT, ':utf8';

my $string
    = join '', map { chr } ( 160,  77, 103, 109, 116,  45,
                              71, 101, 110, 101, 114,  97,
                             108,  45,  79, 116, 104, 101,
                             114 );

print $string, "\n";

$string =~ s/^\s+//u;

print $string, "\n";

另一种方法是显式指定包含各种空格字符的Unicode属性,包括\s中常见的空格字符:

s/^\p{Space}//;

答案 2 :(得分:2)

我发布此内容是因为我没有看到常规解决方案。这是你需要做的。

say ord( $string ); # prints out the numeric value of the character.

# In your case it would print out: 160

# OR

say sprintf( '\x{%x}', ord( $string )); # prints out \x{00} in hex

# In your case: \x{a0}

将其剪切并粘贴到您的替换中:

$string =~ s/^[\s\x{00}]//;

答案 3 :(得分:0)

要删除前导空格,请尝试:$string =~ s/^\s+//;

这应删除主要标签:$string =~ s/^\t+//;