3

二重引用符 (") で囲まれていない限り、文字列からすべてのスペース文字を削除する正規表現を考え出そうとしています。

文字列の例:

「引用符で囲まれたテキスト」を含む文字列

結果:

somestringwith「引用符内のテキスト」

これまでのところ、私は次のようなものを思いつきました:

    $str =~ /"[^"]+"|/g;

しかし、意図した結果が得られていないようです。

正直なところ、私は perl を始めたばかりで、正規表現の経験があまりありません。したがって、答えたい人が、その理由と方法についての洞察を喜んで提供してくれるなら、それは素晴らしいことです!

ありがとう!

編集

文字列にはエスケープされた " は含まれません

実際には、常に次のようにフォーマットする必要があります。

Some.String = "何らかの値"

結果は

Some.String="何らかの値"

4

6 に答える 6

5

splitこれは、引用符で囲まれた文字列を区切るために使用する手法です。データの一貫性に依存しており、緩い引用符では機能しません。

use strict;
use warnings;

my @line = split /("[^"]*")/;
for (@line) {
    unless (/^"/) {
        s/[ \t]+//g;
    }
}
print @line;  # line is altered 

基本的に、引用符で囲まれた文字列を分離するために文字列を分割します。それが完了したら、他のすべての文字列で置換を実行します。配列要素はループ内でエイリアス化されるため、置換は実際の配列で実行されます。

このスクリプトは次のように実行できます。

perl -n script.pl inputfile

出力を表示します。または

perl -n -i.bak script.pl inputfile

inputfileにバックアップを保存しながら、でインプレイス編集を行うにはinputfile.bak

そうは言っても、あなたの編集が何を意味するのかわかりません。変更しますか

Some.String = "Some Value"

Some.String="Some Value"
于 2012-04-20T15:01:04.333 に答える
3

Text::ParseWordsは、これに合わせて作られています:

#!/usr/bin/env perl

use strict;
use warnings;
use Text::ParseWords;

my @strings = (
    q{This.string = "Hello World"},
    q{That " string " and "another   shoutout to my   bytes"},
);

for my $s ( @strings ) {
    my @words = quotewords '\s+', 1, $s;
    print join('', @words), "\n";
}

出力:

This.string="Hello World"
その「文字列」と「私のバイトへの別の叫び」

エスケープされた引用符を含む引用符付き文字列を処理する必要がある場合は、手段を使用しText::ParseWordsてください;-)

また、これは、何らかの構成ファイルがあり、それを解析しようとしているように聞こえます。その場合、おそらくより良い解決策があります。

于 2012-04-20T15:11:20.430 に答える
1

を使用して引用された部分文字列を削除し、中間テキストから空白を削除した後にsplitそれらを再結合することをお勧めします。join

使用される正規表現splitにキャプチャが含まれている場合、キャプチャされた値も返されるリストに含まれることに注意してください。

ここにいくつかのサンプルコードがあります。

use strict;
use warnings;

my $source = <<END;
Some.String = "Some Value";
Other.String = "Other Value";
Last.String = "Last Value";
END

print join '', map {s/\s+// unless /"/; $_; } split /("[^"]*")/, $source;

出力

Some.String= "Some Value";Other.String = "Other Value";Last.String = "Last Value";
于 2012-04-20T15:10:55.997 に答える
0

二重引用符で分割し、偶数フィールド (つまり、引用符で囲まれたもの) からのみスペースを削除します。

sub remove_spaces {
    my $string = shift;
    my @fields = split /"/, $string . ' '; # trailing space needed to keep final " in output
    my $flag = 1;
    return join '"', map { s/ +//g if $flag; $flag = ! $flag; $_} @fields;
}
于 2012-04-20T21:11:47.580 に答える
0

文字列 char を char ごとに単純にループします。このようにして、エスケープされた文字列も処理できます ( isEscaped 変数を追加するだけです)。

my $text='lala "some thing with quotes " lala ... ';
my $quoteOpen = 0;
my $out;

foreach $char(split//,$text) {
  if ($char eq "\"" && $quoteOpen==0) {
    $quoteOpen = 1;
    $out .= $char;
  } elsif ($char eq "\"" && $quoteOpen==1) {
    $quoteOpen = 0;
    $out .= $char;
  } elsif ($char =~ /\s/ && $quoteOpen==1) {
    $out .= $char;
  } elsif ($char !~ /\s/) {
    $out .= $char;
  }
}

print "$out\n";
于 2012-04-20T15:10:18.277 に答える
0

それは正規表現で行うことができます:

s/([^ ]*|\"[^\"]*\") */$1/g

これは、引用符内のいかなる種類のエスケープも処理しないことに注意してください。

于 2012-04-26T15:10:03.803 に答える