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

Android 从商务(交易)短信中提取(解析)金额和描述,android,parsing,sms,inbox,Android,Parsing,Sms,Inbox,我正在做以下步骤 将sms与正则表达式匹配 如果包含指定的关键字,则从sms正文获取值,如金额、说明(交易原因)、账号(如果ATM取款)、交易类型(借方/贷方) 此正则表达式不匹配所有类型的银行/交易sms,因此效率低下。是否有其他方法来识别银行消息 短信示例: 1) 尊敬的客户,您的账号XXXXXX 6377已被215.000卢比贷记为2015年5月19日印度中央银行的DBT/DBTL资金转账 2) 2000年卢比的A/c NN5715借记;ATM WDL。4月24日21:19分,应付账款余额

我正在做以下步骤

  • 将sms与正则表达式匹配

  • 如果包含指定的关键字,则从sms正文获取值,如金额、说明(交易原因)、账号(如果ATM取款)、交易类型(借方/贷方)

    此正则表达式不匹配所有类型的银行/交易sms,因此效率低下。是否有其他方法来识别银行消息

  • 短信示例:

    1) 尊敬的客户,您的账号XXXXXX 6377已被215.000卢比贷记为2015年5月19日印度中央银行的DBT/DBTL资金转账

    2) 2000年卢比的A/c NN5715借记
    ;ATM WDL。4月24日21:19分,应付账款余额(转为chq realisatn)Rs13286.23。如果您未使用您的卡,请拨打1800226999以阻止您的卡

    3) 亲爱的客户,您的AcXXXXXXXX 5666于2月16日被记入8922.00卢比。INF*00008048346*工资。您的净可用余额为8922.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;
    }
    
    私有静态ArrayList解析值(ArrayList主体值){
    ArrayList resSms=新的ArrayList();
    对于(int i=0;i
    以下两个正则表达式有助于从大多数银行交易(HDFC、ICICI、ING、KOTAK、SBI、CANARA、PNB)中查找金额:


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

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

    (?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?-?)
    
    用于从银行交易消息中查找商户名称

    (?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?-?)
    
    用于从银行交易信息中查找卡名(借记卡/信用卡)

    (?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?-?)
    

    在python中,遵循正则表达式可能会有所帮助

    用于在银行消息中查找金额

    [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,}
    

    要在android中检测任何事务性消息,请执行以下操作:

    "(?=.*[Aa]ccount.*|.*[Aa]/[Cc].*|.*[Aa][Cc][Cc][Tt].*|.*[Cc][Aa][Rr][Dd].*)(?=.*[Cc]redit.*|.*[Dd]ebit.*)(?=.*[Ii][Nn][Rr].*|.*[Rr][Ss].*)"
    
    测试了多条银行信息

    请检查

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

    
    从“trny”导入{getTransactionInfo};
    const message=“您的a/c XX0413于2020年12月15日被3211.00卢比借记,用于购买。平均余额:5603.54卢比。”;
    const info=getTransactionInfo(消息);
    /* 
    信息={
    账户:{
    类型:“帐户”,
    编号:“0413”
    },
    余额:“5603.54”,
    货币:“3211.00”,
    交易类型:“借记”
    }
    */
    
    它也有类似的方法


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

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

    它还传递了一条信息:-

  • 扣除金额
  • 已识别余额消息并获取可用消息
  • 帐号
  • 交易模式
  • 参考号/交易信息等

  • 感谢您的回答是这些regx将为交易提供单独的信息谢谢,但我使用[Ii][Nn][Rr](\\s*\\s*\\d*)正则表达式只能获取金额的第一位数字。如何获取所有数字我可以从银行消息中获取金额。但现在我想找到我的金额被记入贷方/借方的账户名称。例如:我的信息是“感谢您在2017-02-20孟买ADITYA BIRLA FASHION使用以1001结尾的借记卡支付2500.00卢比。”现在我想从银行信息中获取“ADITYA BIRLA FASHION”。那么如何做到这一点呢?@priyankakamte:您可以对您的消息使用此模式:(?i)(?:\sat\s|in | on*)([A-Za-z0-9]*\s?-?\s?[A-Za-z0-9]*\s?-?)@Vikalpatel此正则表达式适用于具有at或in或on的消息。但是,如果消息中包含的内容不是这个呢。比如:“亲爱的客户,您在1月30日购买了一张1600.00卢比的借记卡。Info.VPS*AGGARWAL SH.”@priyankakamth您能找到一个涵盖所有这些情况的解决方案吗?这也给了我促销信息。除了信用卡和借记卡交易之外,还有其他方法吗?试着加入更多的词,比如交易、金额……这个正则表达式对我来说很好。试着找出为什么促销信息会被过滤掉。