• ベストアンサー

金額にマッチする正規表現について

ある、複数行の文章内に散在する 最低4桁以上の金額を全て抽出するには? 例えば \#### \####- ####円 と、それぞれ3桁を「,」で区切った数値を金額とみなす場合 1度のパターンマッチで、 上記3つのバリエーションとカンマ付き全種の 不純物が入らない厳密なパターンを記すことは、できますでしょうか? 追記、 以下のような場合は金額とみなしません。 ####(金額に関する記号が前後に付かないため) ####-(頭に\が足りないマイナス単独なため) ###(3桁しかないため) # ###(数値の間の区切りがカンマ以外のため)

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

  • ベストアンサー
回答No.3

ちょっと修正 my $digit = qr{(?:\d){4,}}; my $digit_with_comma = qr{\d{1,3}(?:,\d\d\d)+}; これ以外は同じ

akaginoyama
質問者

お礼

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

その他の回答 (2)

回答No.2

#!/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円

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

これらがその行に単独で存在する, つまり「前後には何もない」のなら難しくもなんともないような気がする. それぞれのパターンを $RE1, $RE2, $RE3 とすると /^(?:$RE1|$RE2|$RE3)$/ だよね.

akaginoyama
質問者

お礼

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

関連するQ&A