从BIZ(交易)短信中提取(解析)金额和描述

时间:2015-06-26 08:09:30

标签: android parsing sms inbox

我正在做以下步骤。

  1. 将短信与正则表达式匹配

  2. 如果包含指定的关键字,则从短信体获取值,如金额,描述(交易原因),账号(如果ATM取款),交易类型(借方/贷方)

    这个正则表达式不匹配所有类型的银行/交易短信因此效率不高,是否有其他方法来识别银行信息。

  3. 示例短信:

    1)尊敬的客户,您的账号 XXXXXX6377 记入 Rs 215.000 是DBT / DBTL资金转账19/05 / 2015年 - 印度中央银行

    2)A / c NN5715 借记 Rs 2000 ; ATM WDL。 A / c Bal(sub to chq realisatn)Rs13286.23 on 24APR 21:19hr。如果您没有使用,请致电1800226999以阻止您的卡。

    3)尊敬的客户,您的Ac XXXXXXXX5666 贷记,于2月16日 INR8,922.00 。 INF * 000080483346 *薪水。您的净可用Bal是8,922.00印度卢比。

    private static ArrayList<SmsDto> parsevalues(ArrayList<SmsDto> body_val) {
        ArrayList<SmsDto> resSms = new ArrayList<>();
        for (int i = 0; i < body_val.size(); i++) {
            SmsDto smsDto = body_val.get(i);
            Pattern regEx
                    = Pattern.compile("(?:inr|rs)+[\\s]*[0-9+[\\,]*+[0-9]*]+[\\.]*[0-9]+");
            // Find instance of pattern matches
            Matcher m = regEx.matcher(smsDto.getBody());
            if (m.find()) {
                try {
                    Log.e("amount_value= ", "" + m.group(0));
                    String amount = (m.group(0).replaceAll("inr", ""));
                    amount = amount.replaceAll("rs", "");
                    amount = amount.replaceAll("inr", "");
                    amount = amount.replaceAll(" ", "");
                    amount = amount.replaceAll(",", "");
                    smsDto.setAmount(Double.valueOf(amount));
                    if (smsDto.getBody().contains("debited") ||
                            smsDto.getBody().contains("purchasing") || smsDto.getBody().contains("purchase") || smsDto.getBody().contains("dr")) {
                        smsDto.setTransactionType("0");
                    } else if (smsDto.getBody().contains("credited") || smsDto.getBody().contains("cr")) {
                        smsDto.setTransactionType("1");
                    }
                    smsDto.setParsed("1");
                    Log.e("matchedValue= ", "" + amount);
                    if (!Character.isDigit(smsDto.getSenderid().charAt(0)))
                        resSms.add(smsDto);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } else {
                Log.e("No_matchedValue ", "No_matchedValue ");
            }
        }
        return resSms;
    }
    

6 个答案:

答案 0 :(得分:11)

从银行交易信息中查找金额。

(?i)(?:(?:RS|INR|MRP)\.?\s?)(\d+(:?\,\d+)?(\,\d+)?(\.\d{1,2})?)

从银行交易消息中找出商家名称。

(?i)(?:\sat\s|in\*)([A-Za-z0-9]*\s?-?\s?[A-Za-z0-9]*\s?-?\.?)

从银行交易信息中找出卡名(借记卡/信用卡)。

(?i)(?:\smade on|ur|made a\s|in\*)([A-Za-z]*\s?-?\s[A-Za-z]*\s?-?\s[A-Za-z]*\s?-?)

答案 1 :(得分:2)

在python中,Regex可以提供帮助。

查找银行留言中的金额

[rR][sS]\.?\s[,\d]+\.?\d{0,2}|[iI][nN][rR]\.?\s*[,\d]+\.?\d{0,2}

寻找A / C否

[0-9]*[Xx\*]*[0-9]*[Xx\*]+[0-9]{3,}

答案 2 :(得分:1)

以下两个正则表达式有助于从大多数银行交易中找到金额(HDFC,ICICI,ING,KOTAK,SBI,CANARA,PNB):

[Ii][Nn][Rr](\\s*.\\s*\\d*)
[rR][sS](\\s*.\\s*\\d*)

如果您已经找到比上述更好的表达方式,请发表评论。

答案 3 :(得分:0)

检测android中的任何交易消息:

"(?=.*[Aa]ccount.*|.*[Aa]/[Cc].*|.*[Aa][Cc][Cc][Tt].*|.*[Cc][Aa][Rr][Dd].*)(?=.*[Cc]redit.*|.*[Dd]ebit.*)(?=.*[Ii][Nn][Rr].*|.*[Rr][Ss].*)"

在多个银行消息上进行了测试

答案 4 :(得分:0)

请检查https://github.com/minimal-scouser/trny

用法:


import { getTransactionInfo } from "trny";

const message = "Your a/c XX0413 is debited on 15/12/2020 by INR 3,211.00 towards purchase. Avl Bal: INR 5,603.54.";

const info = getTransactionInfo(message);
 
/* 
info = {     
   account: {
    type: "account",
    no: "0413"
   },
   balance: "5603.54",
   money: "3211.00",
   typeOfTransaction: "debited" 
}
*/

它也有类似的方法

  1. getAccount
  2. getMoneySpent
  3. getBalance

这需要更多的测试,但看看这是否能解决您的问题。

答案 5 :(得分:0)

请查看此链接:-https://github.com/vikashstm/transactionsmsfilter 此处为最大值,添加了银行过滤器。

它也打通了消息:-

  1. 扣除金额,
  2. 平衡消息识别并获取可用消息
  3. 帐号
  4. 交易模式
  5. 参考编号/交易信息等...