Extract (parse) amount and description from BIZ (T

2019-03-11 07:43发布

I am doing below steps.

  1. match sms with regex

  2. if contains specified keyword then get values from sms body like amount,description (reason of transaction), Account number(if ATM withdraw),transaction type(debit/credit)

    this regex not matching all kind of bank/transaction sms thus it is not efficient , is there any other way to identify bank message.

example sms :

1) Dear Customer, your Account Number XXXXXX6377 has been credited by Rs 215.000 being DBT/DBTL funds transfer on 19/05/2015 - CENTRAL BANK OF INDIA

2)A/c NN5715 debited for Rs 2000; ATM WDL. A/c Bal(sub to chq realisatn) Rs13286.23 on 24APR 21:19hr. Call 1800226999 to block your card if not used by you.

3) Dear Customer, Your Ac XXXXXXXX5666 is credited with INR8,922.00 on 16 Feb. Info. INF*000080483346*SALARY. Your Net Available Bal is INR 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;
}

4条回答
何必那么认真
2楼-- · 2019-03-11 08:14

The following two regular expressions helped in finding amount from most of the bank transactions(HDFC, ICICI, ING, KOTAK, SBI, CANARA, PNB):

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

Please comment if you have figured out much better expressions than the above.

查看更多
我欲成王,谁敢阻挡
3楼-- · 2019-03-11 08:16

To detect any transactional message in android :

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

tested on several bank messages

查看更多
走好不送
4楼-- · 2019-03-11 08:18

In python following Regex can be helpful.

For finding amount in bank messages

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

For finding A/C no

[0-9]*[Xx\*]*[0-9]*[Xx\*]+[0-9]{3,}
查看更多
霸刀☆藐视天下
5楼-- · 2019-03-11 08:23

For finding out amount from bank transaction message.

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

For finding out merchant name from bank transaction message.

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

For finding out card name(debit/credit card) from bank transaction message.

(?i)(?:\smade on|ur|made a\s|in\*)([A-Za-z]*\s?-?\s[A-Za-z]*\s?-?\s[A-Za-z]*\s?-?)
查看更多
登录 后发表回答