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分,应付账款余额
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您能找到一个涵盖所有这些情况的解决方案吗?这也给了我促销信息。除了信用卡和借记卡交易之外,还有其他方法吗?试着加入更多的词,比如交易、金额……这个正则表达式对我来说很好。试着找出为什么促销信息会被过滤掉。