我正在执行以下步骤。
使用正则表达式匹配短信
如果包含指定的关键字,则从短信正文中获取值,例如金额、描述(交易原因)、帐号(如果是 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;
}