dポイントプレゼントキャンペーン実施中!

こんにちは
perlで特定の文字列からその後ろをすべて
削除したいのですが、うまくできなくて質問します。

Ex)123.12abc   ⇒123.12
012.123abc   ⇒012.123
123.1234|| ⇒123.1234

上記のようなデータの少数点までの数字の後ろにabc、||、半角、全角スペースなど文字列があります.
少数点までの数字の後ろの文字列すべてを削除したいですが、
特定の文字列からその後ろにある文字列全てを指定する方法(正規表現)はありませんでしょうか?

どうかご存知の方、教えてください!!
よろしくお願いいたします。

A 回答 (7件)

実験すればわかるけど, 可能なら「0 を足す」のが最も簡単ですぜ>#6.

    • good
    • 0

小数点付きの数字のみにしたい時は…


正規表現を /(\d+\.\d+)/ として $1にアクセスすればよくて

↓さんぷるこーど。 
===========================================
use strict;
use warnings;

while(<DATA>) {
chomp $_;
/(\d+\.\d+)/;
print "str:", $_, "\t-> ", $1 , "\n";
}

__DATA__
123.12abc
012.123abc
123.1234||

===========================================

整数のみも対応したければ
正規表現を /(\d+(\.\d+)?)/ として $1 にアクセスすればよいですね
↓さんぷるこーど。
===========================================
use strict;
use warnings;

while(<DATA>) {
chomp $_;
/(\d+(\.\d+)?)/;
print "str:", $_, "\t->",$1 , "\n";
}

__DATA__
123.12abc
012.123abc
123.1234||
===========================================
    • good
    • 0

こういう事ですね?



『文字列の先頭に、小数点付数値と解釈できる内容が入っています。 数値の一部とみなせない後続文字を削除したいです。』


if( $text !~ s/(\.\d*).*$/$1/s ) {
 die("入力がおかしいよ。\n");
}
print "$text を認識しました。\n";

# 小数点の無い整数には対応できません。
    • good
    • 0

例の 'abc' はどこにいったんだろう.


さておき, いろんな方法があって
・s/\|\|.*//; でつぶす
・m/(\d+\.\d*)\|\|/; で取り出す
・(split(/\|\|/))[0] で「最初の項目」を取り出す
・+0 で強制的に数値に変換する
などは思い付く.
    • good
    • 0

Tacosasさんがおっしゃっているように意味が分からないです。



最初では
>上記のようなデータの少数点までの数字の後ろにabc、||、半角、
>全角スペースなど文字列があります.
>少数点までの数字の後ろの文字列すべてを削除したいですが、
 なので、文面から最初の小数点「 . 」以降を消したいと読めます。

 が、 Tacosasさんへの補足では、
>'||'からその後ろまでを削除したいということです。
 小数点は何処へ行ってしまったのでしょうか?

 || と それ以降を削除でしたら、

$data =~ /^(.+)?\|\|/; ではどうでしょう。
    • good
    • 0

「少数点までの数字の後ろの文字列すべてを削除したい」って, 何がしたいのか理解できないんだけど.... 「少数点」は「小数点」のことだと思っていい?


でそうだとしても, 例えば一番上の 123.12abc の例だと, 「小数点までの数字」ってのは「123」だよね. 「その後ろの文字列すべてを削除」って言われても「1」より後ろなのか「2」より後ろなのか「3」より後ろなのかがわかんない. そして, 挙がっている例ではこのいずれでもない.
ということで, やりたいことを「正確に」書いてください.

この回答への補足

ごめんなさい。
質問がおかしかったです。
たとえば'123.1234||abcd'のような数値のあとに文字列がつく場合
'||abcd'を削除し、'123.1234'にしたいです。
数値の後に付く文字列は'||'のあとにくる文字列が'abcd'ではなく、
’edfg’’hijk’みたいに特定できないため、'||'からその後ろまでを
削除したいということです。

補足日時:2009/01/26 22:48
    • good
    • 0

小数点の前が必ず数字のみという条件で、その中の小数点以降を全て削除なら、



$data = '123.1234|| ⇒123.1234';

$data =~ /^(\d+)?\./;

print $1;

で、どうでしょうか。
    • good
    • 0

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