我正在做以下步骤。
将短信与正则表达式匹配
如果包含指定的关键字,则从短信体获取值,如金额,描述(交易原因),账号(如果ATM取款),交易类型(借方/贷方)
这个正则表达式不匹配所有类型的银行/交易短信因此效率不高,是否有其他方法来识别银行信息。
示例短信:
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;
}
答案 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"
}
*/
它也有类似的方法
这需要更多的测试,但看看这是否能解决您的问题。
答案 5 :(得分:0)
请查看此链接:-https://github.com/vikashstm/transactionsmsfilter 此处为最大值,添加了银行过滤器。
它也打通了消息:-