Извлечение (парсинг) суммы и описания из смс BIZ (Транзакция)

Я делаю следующие шаги.

  1. сопоставить смс с регулярным выражением

  2. если содержит указанное ключевое слово, то получить значения из тела 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;
}

person Rakshit Soni    schedule 26.06.2015    source источник


Ответы (6)


Для определения суммы из сообщения о банковской транзакции.

(?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?-?)
person user6375289    schedule 24.05.2016
comment
У меня работает получение суммы из банковского сообщения. Но теперь я хочу найти имя учетной записи, с которой моя сумма будет зачислена / списана. например: мое сообщение похоже на «Спасибо за использование дебетовой карты, заканчивающейся на 1001, за 2500 рупий в MUMBAI в ADITYA BIRLA FASHION 20 февраля 2017 года. Теперь я хочу получить ADITYA BIRLA FASHION из банковских сообщений. так как это сделать? - person priyanka kamthe; 04.03.2017
comment
@priyankakamthe: Вы можете использовать этот шаблон для своего сообщения: (? i) (?: \ sat \ s | in | on *) ([A-Za-z0-9] * \ s? -? \ s? [A -Za-z0-9] * \ s? -? \.?) - person Vikalp Patel; 06.03.2017
comment
@VikalpPatel этот regx работает для тех сообщений, которые имеют at или in или on. Но что, если сообщение содержит что-то иное, чем это. Нравится: Уважаемый покупатель, 30 января вы совершили покупку с помощью дебетовой карты на сумму 1 600 индийских рупий. Info.VPS * AGGARWAL SH. - person priyanka kamthe; 06.03.2017
comment
@priyankaKamthe удалось ли вам найти исправление, которое охватывает все эти случаи? - person Archit Puri; 26.07.2020

В 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,}
person Gaurav Dabhade    schedule 29.11.2017

Следующие два регулярных выражения помогли найти сумму по большинству банковских транзакций (HDFC, ICICI, ING, KOTAK, SBI, CANARA, PNB):

[Ii][Nn][Rr](\\s*.\\s*\\d*)
[rR][sS](\\s*.\\s*\\d*)

Прокомментируйте, если вы придумали гораздо лучшие выражения, чем приведенные выше.

person Anudeep    schedule 28.08.2015
comment
спасибо за ответ, эти regx предоставят отдельную информацию о транзакции - person Rakshit Soni; 29.08.2015
comment
спасибо, но я получаю только первую цифру суммы, используя выражение регулятора [Ii] [Nn] [Rr] (\\ s *. \\ s * \\ d *). как я могу получить все цифры - person D G; 03.11.2017

Чтобы обнаружить любое транзакционное сообщение в android:

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

протестировано на нескольких банковских сообщениях

person Ajay Chauhan    schedule 03.03.2018
comment
Это также дает мне рекламные сообщения. Есть ли альтернатива, чтобы узнать только о транзакциях по кредитным и дебетовым картам? - person Yamuna; 02.06.2018
comment
попробуйте включить больше слов, таких как Transaction, Amount .. Это регулярное выражение отлично работало для меня. Попытайтесь выяснить, почему это рекламное сообщение фильтруется. - person Ajay Chauhan; 04.06.2018

Пожалуйста, проверьте 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

Это требует дополнительного тестирования, но посмотрите, решит ли это вашу проблему.

person Minimal Scouser    schedule 20.03.2021

Пожалуйста, проверьте по этой ссылке: -https: //github.com/vikashstm/transactionsmsfilter Здесь максимум, добавлен банковский фильтр.

Он также получил сообщение: -

  1. Вычитаемая сумма,
  2. сообщение баланса идентифицировано и получить доступное сообщение
  3. Номер счета
  4. Режим транзакции
  5. Справочный номер / информация о транзакции и т. Д.
person vikashstmand    schedule 10.05.2021