2

正規表現を使用して、文字列の先頭から非常に頑固なスペースを削除しようとしています。この文字列は、Text:CSVモジュールを使用してCSVファイルからPerlに解析されており、文字列のダンパーを出力すると、次のようになります。

$VAR1 = ' Mgmt-General-Other';  

今、私はこのスペースを削除するために正規表現を使用しようとしました、誰かが私に使用するように言うでしょう:

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

私はすでにこれと同様に試しました:

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

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

そして、これらのどれもうまくいきませんでした、真ん中のものは私が欲しかったものを除いてすべてからすべてのスペースを引き出しました。2,000行のCSVファイルをループしようとしているので、これを自動化して、この1つの奇妙なインスタンスに特別なケースを作成する必要はありません。

最初のこの文字がスペースまたは空白ではない方法はありますか?または、どうすればそれを取り出すことができますか?

私が試したことをさらに追加します。

$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もう1つの方法は、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";

もう1つのアプローチは、以下に通常見られるものを含む、あらゆる種類のスペース文字を含む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 に答える