• ベストアンサー

split で " または ' で挟まれた部分を一つとして処理するには?

perl で 文字列を split で処理する時に、" や ' で挟まれた領域を一つの文字列として処理するにはどうやったらよいのでしょうか? たとえば $aaa = "aaa bbb 'c d e' fff"; @aaa = split(/ /, $aaa); だと、 aaa bbb 'c d e' fff となってしまいますが、 aaa bbb 'c d e' fff となるようにするにはどうするのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • ryu_chan
  • ベストアンサー率37% (69/186)
回答No.1

一発で分割する正規表現は思い浮かびませんでした。 (ダブル)クオテーションで囲まれた部分にあるスペースを一旦、\0に置き換えてから splitし、その後また元のスペースに戻すという方法を思いつきました。 $aaa = "aaa bbb 'c d e' fff"; $aaa =~ s/(['"].*?['"])/(my $s = $1) =~ tr| |\0|; $s/eg; @aaa = split / /, $aaa; @aaa = map { s/(['"].*?['"])/(my $s = $1) =~ tr|\0| |; $s/eg; $_ } @aaa;

moritan2
質問者

お礼

ご回答ありがとうございました。 ここでの皆さまのご回答を参考にしてできるようになりました。

その他の回答 (3)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

一応無理すれば @aaa = grep { defined $_ } split(/('.*?'|".*?")|\s+/, $aaa); とかできるけど... split だけではダメだと思う.

moritan2
質問者

お礼

ご回答ありがとうございました。 質問が変でした。 split だけでは無理なので、どうやればよいか、と書くべきでした。 ここでの皆さまのご回答を参考にしてできるようになりました。

回答No.3

ダブルクォーテーションが抜けてた my $str = q(aaa bbb 'c d e' fff '' a b c 'X' 'Y' "AAA BBB" aiueo); print "$str\n"; my @items = ( $str =~ /(?:"[^"]*")|(?:'[^']*')|(?:[^ ]+)/g ); for my $item (@items) { print "$item\n"; }

moritan2
質問者

お礼

ご回答ありがとうございました。 質問が変でした。 split だけでは無理なので、どうやればよいか、と書くべきでした。 ここでの皆さまのご回答を参考にしてできるようになりました。

回答No.2

split じゃ、たぶん無理です my $str = "aaa bbb 'c d e' fff '' a b c 'X' aiueo"; my @items = ( $str =~ /(?:'[^']*')|(?:[^ ]+)/g ); for my $item (@items) { print "$item\n"; }

moritan2
質問者

補足

質問が変でした。 split だけでは無理なので、どうやればよいか、と書くべきでした。 ここでの皆さまのご回答を参考にしてできるようになりました。

関連するQ&A