- ベストアンサー
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 となるようにするにはどうするのでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
一発で分割する正規表現は思い浮かびませんでした。 (ダブル)クオテーションで囲まれた部分にあるスペースを一旦、\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;
その他の回答 (3)
- Tacosan
- ベストアンサー率23% (3656/15482)
一応無理すれば @aaa = grep { defined $_ } split(/('.*?'|".*?")|\s+/, $aaa); とかできるけど... split だけではダメだと思う.
お礼
ご回答ありがとうございました。 質問が変でした。 split だけでは無理なので、どうやればよいか、と書くべきでした。 ここでの皆さまのご回答を参考にしてできるようになりました。
- _--_1l1_1_
- ベストアンサー率67% (102/152)
ダブルクォーテーションが抜けてた 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"; }
お礼
ご回答ありがとうございました。 質問が変でした。 split だけでは無理なので、どうやればよいか、と書くべきでした。 ここでの皆さまのご回答を参考にしてできるようになりました。
- _--_1l1_1_
- ベストアンサー率67% (102/152)
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"; }
補足
質問が変でした。 split だけでは無理なので、どうやればよいか、と書くべきでした。 ここでの皆さまのご回答を参考にしてできるようになりました。
お礼
ご回答ありがとうございました。 ここでの皆さまのご回答を参考にしてできるようになりました。