2015-06-26 18 views
5

Ich mache die folgenden Schritte.Extrahieren (parsen) Betrag und Beschreibung von BIZ (Transaktion) SMS

  1. Spiel sms mit regex

  2. wenn enthält angegebene Schlüsselwort dann Werte von sms Körper erhalten wie Menge, Beschreibung (Grund der Transaktion), Kontonummer (wenn Bancomaten), Bewegungsart (Debit-/Kredit)

    diese Regex nicht alle Art von Bank/Transaktion sms daher ist es nicht effizient, gibt es eine andere Möglichkeit, Bank Nachricht zu identifizieren.

Beispiel SMS:

1) Sehr geehrter Kunde, Ihre Kontonummer XXXXXX6377 wurde gutgeschrieben von Rs 215.000 ist DBT/DBTL Weisung am 19/05/2015 - ZENTRALBANK INDIEN

2) A/c NN5715 für Rs 2000 belastet; ATM WDL. A/C Bal (sub bis Chq Realisatn) Rs13286.23 am 24APR 21: 19hr. Rufen Sie 1800226999 an, um Ihre Karte zu sperren, wenn sie nicht von Ihnen benutzt wird.

3) Sehr geehrter Kunde, Ihre Ac XXXXXXXX5666 ist gutgeschrieben mit INR8,922.00 am 16. Februar Info. INF * 000080483346 * GEHALT. Ihr verfügbares Bal ist 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; 
} 

Antwort

1

Die folgenden zwei regulären Ausdrücken half Menge von den meisten der Bankgeschäfte bei der Suche nach (HDFC, ICICI, ING, KOTAK, SBI, CANARA, PNB):

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

Bitte kommentieren Sie, wenn Sie fand viel bessere Ausdrücke als die oben genannten.

+0

danke für ein swier ist diese Regx Willen gibt Transaktion separate info –

+0

danke, aber ich bekomme nur die erste Ziffer der Menge mit [Ii] [Nn] [Rr] (\\ s *. \\ s * \\ d *) reguler Ausdruck.wie kann ich bekomme alle Ziffern –

9

Zum Ermitteln des Betrags aus der Banktransaktionsmeldung.

(?i)(?:(?:RS|INR|MRP)\.?\s?)(\d+(:?\,\d+)?(\,\d+)?(\.\d{1,2})?) 

Zum Herausfinden des Händlernamens aus der Banktransaktionsmeldung.

Zum Ermitteln des Kartennamens (Debit/Kreditkarte) von der Banktransaktionsmeldung.

(?i)(?:\smade on|ur|made a\s|in\*)([A-Za-z]*\s?-?\s[A-Za-z]*\s?-?\s[A-Za-z]*\s?-?) 
+1

Es funktioniert für mich, Betrag von Bank Nachricht zu holen. Aber jetzt möchte ich den Namen des Kontos finden, von dem mein Betrag gutgeschrieben/abgebucht wird. zB: meine Nachricht ist wie "Vielen Dank für die Verwendung Debitkarte endet mit 1001 für Rs.2500.00 in Mumbai bei ADITYA BIRLA FASHION am 2017-02-20." Jetzt möchte ich "ADITYA BIRLA FASHION" von Banknachrichten holen. wie geht das? –

+0

@priyankakamthe: Sie können dieses Muster für Ihre Nachricht verwenden: (? I) (?: \ Sat \ s | in | on \ *) ([A-Za-z0-9] * \ s? -? \ S? [A-Za-z0-9] * \ s? -? \.?) –

+0

@VikalpPatel Dieses regx funktioniert für jene Nachrichten, die ** at ** oder ** in ** oder ** on ** haben. Aber was, wenn die Nachricht anderes enthält? Like: "Sehr geehrter Kunde, Sie haben am 30. Jan. Info.VPS * AGGARWAL SH einen Debit Card-Kauf von INR1,600.00 getätigt." –

0

In Python folgenden Regex kann hilfreich sein.

Für Banknachrichten finden Menge

[rR][sS]\.?\s[,\d]+\.?\d{0,2}|[iI][nN][rR]\.?\s*[,\d]+\.?\d{0,2} 

für die Suche nach A/C nicht

[0-9]*[Xx\*]*[0-9]*[Xx\*]+[0-9]{3,} 
0

Um eine Transaktionsnachricht in android zu erkennen:

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

auf mehrere Banknachrichten getestet