電子書籍の厳選無料作品が豊富!

ある、複数行の文章内に散在する
最低4桁以上の金額を全て抽出するには?

例えば
\####
\####-
####円
と、それぞれ3桁を「,」で区切った数値を金額とみなす場合

1度のパターンマッチで、
上記3つのバリエーションとカンマ付き全種の
不純物が入らない厳密なパターンを記すことは、できますでしょうか?



追記、
以下のような場合は金額とみなしません。
####(金額に関する記号が前後に付かないため)
####-(頭に\が足りないマイナス単独なため)
###(3桁しかないため)
# ###(数値の間の区切りがカンマ以外のため)

A 回答 (3件)

ちょっと修正


my $digit = qr{(?:\d){4,}};
my $digit_with_comma = qr{\d{1,3}(?:,\d\d\d)+};

これ以外は同じ
    • good
    • 0
この回答へのお礼

回答有難うございます。
なるほどこうすればよいのか?と納得です。
読むのと書くのでは雲泥差があるように思えました。
自身では書け無いので本当に助かりました。

お礼日時:2011/04/24 14:16

#!/usr/bin/perl


use strict;
use warnings;
use utf8;

# for over 4 digits
my $digit = qr{\d(?:\d){3,}};
my $digit_with_comma = qr{\d{1,3}(?:,(?:\d){3})+};

my $regex1 = qr{\\${digit}-{0,1}};
my $regex2 = qr{\\${digit_with_comma}-{0,1}};
my $regex3 = qr{${digit}円};
my $regex4 = qr{${digit_with_comma}円};

my $text = do {local $/ = undef; <DATA>};
my @prices = ($text =~ m/$regex1|$regex2|$regex3|$regex4/g);

binmode STDOUT, ":encoding(utf8)";
print $_, $/ for @prices;

__DATA__
-- normal pattern1
\1234
\12345
\123456
\1234567
\1,234
\12,345
\123,456
\1,234,567

-- normal pattern2
\1234-
\12345-
\123456-
\1234567-
\1,234-
\12,345-
\123,456-
\1,234,567-

-- normal pattern3
1234円
12345円
123456円
1234567円
1,234円
12,345円
123,456円
1,234,567円

-- error pattern1
\123
\123-
123円

-- error pattern2
1234
1234-
1234yen
1,234
1,234-
1,234yen

-- error pattern3
1 234
1 234-
1 234円
    • good
    • 0

これらがその行に単独で存在する, つまり「前後には何もない」のなら難しくもなんともないような気がする.



それぞれのパターンを $RE1, $RE2, $RE3 とすると
/^(?:$RE1|$RE2|$RE3)$/
だよね.
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
前後に数値以外のどんな文字列が来るかは決まってません。
但し、金額に関する記号\や-や円は前後に入りません。

お礼日時:2011/04/24 14:09

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