• ベストアンサー

不特定数存在する特定文字直後にある文字を配列に入れる

perlとMySQLでデータベースを作っています。 だいぶ行き詰ってしまったので質問させてください。 以下のような一行の文字列が存在するとします。 ABC DEF @@@2222 EHI J @@@888 KL MN OPQR @@@632 ST この中から、 2222 888 632 を取り出して配列に格納することは可能でしょうか? 分割することは可能な気はするのですが、 それを配列に入れるとなるとどうにもならなくなってしまいました。 漠然とした質問で大変申し訳ないのですが、 なにかヒントになるものだけでもお気づきの方いらっしゃいましたら、 ぜひご教示くださいませ。

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

  • ベストアンサー
  • okmotokun
  • ベストアンサー率59% (92/155)
回答No.3

やり方はいろいろありますが、「英数字と空白以外の文字列」に続く「英数字文字列」を配列に入れるなら、 $str='ABC DEF @@@2222 EHI J @@@888 KL MN OPQR @@@632 ST'; (@array)=($str=~/(?<=[^\s\w])(\w+)/g);

despie
質問者

お礼

ご回答ありがとうございます。 なるほど! >(?<=[^\s\w])(\w+)/g); この部分を解読していて、 こんな方法もあるのかと感心してしまいました。 今はとりあえずspliceを使ってうまくいっているのですが、 バグが出るようならこちらの方法で試してみたいと思います。 ありがとうございました。

その他の回答 (2)

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

この文章だけからは「何を取り出すのか」が分かりません. どんな文字列が来てもいいように, 言葉で「取り出すべきもの」を規定してください. それができなければ, プログラムにすることは不可能です. 案外 s/@@@(\d+)/g くらいだったりして.

despie
質問者

お礼

ご回答ありがとうございます。 言葉足らず過ぎてすみませんでした。 今回のケースでは、 逆に後で分割するために@@@という文字列を途中で足していました。 ですので取り出すべきものは、 @@@直後にある不特定数桁の数字というものでした。 このままだと分割するのに困ったので、 街頭数字の頭と末尾両方に@@@を入れることでなんとか解決することができました。 ありがとうございました。

noname#108428
noname#108428
回答No.1

まず、文字列をスペースでsplitします。 その配列の要素ひとつひとつに対し、 @@@を含むか否か、をジャッジします。 含むものだけを抜き出し、別の配列に格納します。 その配列の全ての要素に対し、 @@@を削除する処理を施します。

despie
質問者

お礼

ご回答ありがとうございます。 論理的な処理順序はなんとか理解できていたのですが、 >含むものだけを抜き出し、別の配列に格納します。 この部分の方法が思いつきませんでした。 結局spliceという関数でなんとかすることができました。 ヒントをいただき、ありがとうございました。

関連するQ&A