1

以下のような文字列があります。

$line = 'this is my string "hello world"';

「Hello world」の領域を除いて、文字列内のすべてのスペース文字を削除する正規表現が必要です。

以下を使用してスペース文字を削除しますが、すべて削除されます。

$line=~s/ +//g;

「Hello world」の間の領域を除外して、以下のような文字列を取得するにはどうすればよいですか?

thisismystring"hello world"

ありがとう

4

5 に答える 5

4

おそらく引用符で囲まれた文字列を適切に処理したいので、Text::Balancedモジュールを確認する必要があります。

これを使用して、テキストを引用部分と非引用部分に分割し、引用部分以外の部分のみを置換して、最後に文字列を再び結合します。

于 2012-08-15T12:17:55.390 に答える
1

さて、これを行う1つの方法は次のとおりです。

use warnings;
use strict;

my $l = 'this is my string "hello world some" one two three "some hello word"';
$l =~ s/ +(?=[^"]*(?:"[^"]*"[^"]*)+$)//g;

print $l;
# thisismystring"hello world some"onetwothree"some hello word"

デモ

しかし、特に引用符のバランスが取れていない可能性がある場合は、他の方法で(たとえば、文字列をトークン化することによって)行うべきではないのではないかと思います。

于 2012-08-15T12:20:10.477 に答える
0
s/\s+(?=(?:[^"]*"[^"]*")*[^"]*$)//g

ここでコードをテストします。

于 2012-08-15T12:16:29.397 に答える
0

それを行う別の正規表現

s/(\s+(".*?")?)/$2/g
于 2012-08-15T12:22:58.343 に答える
0
#!/usr/bin/perl
use warnings;
use strict;

sub main {
  my $line = 'this is my string "hello world"';
  while ($line =~ /(\w*|(?:"[^"]*"))\s*/g) { print $1;}
  print "\n";
}

main;
于 2012-08-15T12:23:00.287 に答える