Я делаю следующие шаги.
сопоставить смс с регулярным выражением
если содержит указанное ключевое слово, то получить значения из тела sms, такие как сумма, описание (причина транзакции), номер счета (если снятие средств через банкомат), тип транзакции (дебет / кредит)
это регулярное выражение не соответствует всем типам SMS-сообщений банка / транзакции, поэтому оно неэффективно, есть ли другой способ идентифицировать банковское сообщение.
пример смс:
1) Уважаемый клиент, номер вашего счета XXXXXX6377 был зачислен на 215 000 рупий в виде денежного перевода DBT / DBTL 19 мая 2015 г. - CENTRAL БАНК ИНДИИ
2) A / c NN5715 списано на 2000 рупий; Банкомат WDL. Кондиционер Bal (в соответствии с реализацией chq) 13286,23 рупий 24 апреля в 21:19. Позвоните по номеру 1800226999, чтобы заблокировать вашу карту, если вы не используете ее.
3) Уважаемый покупатель, 16 февраля на ваш счет XXXXXXXX5666 зачислено 8 922,00 индийских рупий. INF * 000080483346 * ЗАРПЛАТА. Ваш чистый доступный баланс составляет 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;
}