2

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

$VAR1 = ' Mgmt-General-Other';  

现在我尝试使用正则表达式删除这个空间,有人会告诉我使用:

$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

4 回答 4

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]+//;
于 2012-07-16T20:47:38.123 回答
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_strings另一种选择是只为处理 Unicode 字符串的特定正则表达式打开语义:

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}//;
于 2012-07-16T23:30:26.417 回答
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}]//;
于 2012-07-16T23:37:46.843 回答
0

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

这应该删除前导标签:$string =~ s/^\t+//;

于 2012-07-16T20:50:14.987 回答