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

Rak*_*oni 9 sms parsing android inbox

我正在做以下步骤.

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

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

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

示例短信:

1)尊敬的客户,您的帐号XXXXXX6377已经卢比215.000是DBT/DBTL资金转移上19/05/2015 -印度中央银行

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

3)尊敬的客户,您的交流XXXXXXXX5666记入INR8,922.00于2月16日的信息.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;
}
Run Code Online (Sandbox Code Playgroud)

小智 11

用于从银行交易消息中查找金额.

(?i)(?:(?:RS|INR|MRP)\.?\s?)(\d+(:?\,\d+)?(\,\d+)?(\.\d{1,2})?)
Run Code Online (Sandbox Code Playgroud)

用于从银行交易消息中找出商家名称.

(?i)(?:\sat\s|in\*)([A-Za-z0-9]*\s?-?\s?[A-Za-z0-9]*\s?-?\.?)
Run Code Online (Sandbox Code Playgroud)

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

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

  • @VikalpPatel此正则表达式适用于那些具有 **at** 或 **in** 或 **on** 的消息。但是如果消息包含除此之外的内容怎么办?例如:“尊敬的客户,您已于 1 月 30 日通过借记卡购买了 INR1,600.00。Info.VPS*AGGARWAL SH。” (2认同)

Anu*_*Anu 2

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

[Ii][Nn][Rr](\\s*.\\s*\\d*)
[rR][sS](\\s*.\\s*\\d*)
Run Code Online (Sandbox Code Playgroud)

如果您想出比上述更好的表达方式,请发表评论。