もふもふ技術部

IT技術系mofmofメディア

文字列の中から正規表現で金額を全て抽出する(Ruby)

固有表現抽出の出来るLUISとかを使えば、日本円での金額表記を簡単に抽出出来るかなーと思ったらprebuildのentityでは○○円という表現しつか抽出できなかった。

luis

LUISのUIが一新され、Prebuilt entityが日本語も認識するようになった件 - Qiita

のであきらめて普通にRubyを使って正規表現で抽出します。

正規表現サンプル集を参考にした

$ irb
str = 'この文章内にある金額表現を抽出したいです¥1,000、1000円、1,000円ほげ、1,000、1,000,000円、、、¥1,000,000、10,0,11。。1000000、123456789、,100'

カンマ付きの金額のみ抽出する

irb(main):072:0> str.scan(/\d{1,3}(?:,\d{3})+/)
=> ["1,000", "1,000", "1,000", "1,000,000", "1,000,000"]

カンマ付き、カンマなしを含め全て抽出する

 str.scan(/\d{1,3}(?:,\d{3})+|\d+/)
=> ["1,000", "1000", "1,000", "1,000", "1,000,000", "1,000,000", "10", "0", "11", "1000000", "123456789", "100"]

補足

#scanで抽出する際、正規表現のグループ化()を使用すると、キャプチャされてしまって戻り値が期待しているのと違う形になってしまう(カンマの右側だけキャプチャされる)。

irb(main):077:0> str.scan(/\d{1,3}(,\d{3})+/)
=> [[",000"], [",000"], [",000"], [",000"], [",000"]]

今回はマッチするところを全て抽出したかったので、キャプチャなしのグループ化(?: pattern)を使うことで解決してます。