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

14

我正在执行以下步骤。

  1. 使用正则表达式匹配短信

  2. 如果包含指定的关键字,则从短信正文中获取值,例如金额、描述(交易原因)、帐号(如果是 ATM 取款)、交易类型(借记/贷记)

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

示例短信:

1)尊敬的客户,您的帐号号码为XXXXXX6377的账户于19/05/2015收到了215.000卢比的DBT/DBTL资金转移-印度中央银行

2)A/c NN5715 在24APR 21:19hr被扣除了 Rs 2000;ATM WDL。A/c Bal (sub to chq realisatn) 为 Rs13286.23。如果您没有使用,请致电1800226999以停用您的卡。

3)尊敬的客户,您的AcXXXXXXXX5666在2月16日获得INR8,922.00。信息:INF * 000080483346 * SALARY。您的净可用余额为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;
}
6个回答

21

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

(?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
我的程序可以成功获取银行信息中的金额,但现在我想要找到这笔款项是从哪个账户转入或转出的。例如:我的信息内容为“感谢您于2017-02-20在孟买ADITYA BIRLA FASHION使用卡号后四位为1001的借记卡消费2500.00元。” 现在我想要从银行信息中获取“ADITYA BIRLA FASHION”的名称,该如何实现呢? - priyanka kamthe
@priyankakamthe:你可以使用这个模式来匹配你的消息:(?i)(?:\sat\s|in|on*)([A-Za-z0-9]*\s?-?\s?[A-Za-z0-9]*\s?-?.?) - Vikalp Patel
1
@VikalpPatel 这个正则表达式适用于包含 atinon 的消息。但是如果消息中包含其他内容怎么办?比如: “尊敬的客户,您在1月30日进行了一笔1,600.00卢比的借记卡购买。信息:VPS*AGGARWAL SH。” - priyanka kamthe
@priyankaKamthe,你能找到一个解决方案来覆盖所有这些情况吗? - Archit Puri

3
在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,}

2
以下两个正则表达式可用于从大多数银行交易记录(HDFC、ICICI、ING、KOTAK、SBI、CANARA、PNB)中查找金额:
[Ii][Nn][Rr](\\s*.\\s*\\d*)
[rR][sS](\\s*.\\s*\\d*)

如果您发现比上述更好的表达方式,请留下评论。


感谢您的回答,这些正则表达式是否会提供交易分离信息? - Rax
谢谢,但是我只能使用[Ii][Nn]Rr正则表达式获取金额的第一位数字。如何获取所有数字? - D G

2
请在此链接中查看:https://github.com/vikashstm/transactionsmsfilter 这里添加了最大的银行过滤器。
它还可以通过以下信息获取:
1. 扣除金额, 2. 识别余额信息并获取可用信息 3. 账户号码 4. 交易模式 5. 参考号码/交易信息等...

1

在Android中检测任何事务性消息:

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

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


这也给我推广信息。有没有其他方法只查找信用卡和借记卡交易? - Yamuna
尝试包含更多像Transaction、Amount这样的单词。这个正则表达式之前一直能够正常工作。试着找出为什么那条促销信息被过滤掉了。 - Ajay Chauhan

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

这需要进行更多测试,但可以试一下看看能否解决您的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接