アプリ版:「スタンプのみでお礼する」機能のリリースについて

テキストデータの処理がうまくいかず困っています。

-----------------------------------------------
a:0.001 b:-11.111 c:50.5 d:-12.345
-----------------------------------------------

といった文字列から

-----------------------------------------------
0.001 -11.111 50.5 -12.345
-----------------------------------------------

といった形で符号や小数点を含めて抽出したいのですが
どのようにするのが良いのでしょうか。

各値は、それぞれの値がスペースによって区切られています。
また、各値は数値の大きさがそれぞれ異なり桁数が一定ではありません。


split や substr を用いてやろうとしているのですが、
なかなか思ったとおりの形で出力できません…

A 回答 (3件)

split(/[\sA-Za-z:]+/,文字列);を使用します。


以下サンプル
while(<DATA>){
@elm = split(/[\sA-Za-z:]+/,$_);
print $elm[0],"\t",$elm[1],"\t",$elm[2],"\t",$elm[3],"\t",$elm[4],"\n";
}
__DATA__
a:0.001 b:-11.111 c:50.5 d:-12.345
a:0.001 b:-11.112 c:50.5 d:-12.346
a:0.001 b:-11.113 c:50.5 d:-12.347

実行結果は
0.001-11.11150.5-12.345
0.001-11.11250.5-12.346
0.001-11.11350.5-12.347
となります。
$elm[0]は数値が入りませんので、使用しないで下さい。
$elm[1]~$elm[4]に目的の数値がはいります。
    • good
    • 0

/([+-]?(?:(?:\d*\.)?\d+))/g;


にマッチさせてみるとか.
または
tr/0-9+.-/ /cs;
で不要な文字をつぶしてから split など.
    • good
    • 0

リストコンテキストで、gフラグをつけてマッチを実行すれば数値の部分だけ取り出すのは簡単にできます。



use strict;
use warnings;
use feature 'say';

use Regexp::Common;

while (<DATA>) {
chomp;
my @numbers = /$RE{num}{real}/g;
say join ' ', @numbers;
}


__END__
a:0.001 b:-11.111 c:50.5 d:-12.345
a:0.001 b:-11.112 c:50.5 d:-12.346
a:0.001 b:-11.113 c:50.5 d:-12.347


実行結果:
0.001 -11.111 50.5 -12.345
0.001 -11.112 50.5 -12.346
0.001 -11.113 50.5 -12.347

Regexp::Commonをインストールする必要がありますが、#2のTacosanさんが
示されているような正規表現を使えばRegexp::Common抜きでも同様のことが可能です。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!