2015-06-26 27 views
5

Sto facendo sotto i passaggi.Estratto (analisi) importo e descrizione da sms BIZ (Transazione)

  1. partita sms con regex

  2. se contiene parola chiave specificata quindi ottenere valori da corpo sms come quantità, descrizione (motivo della transazione), numero di conto (se bancomat ritirare), tipo di transazione (debito/credito)

    questa espressione regolare non corrisponde a tutti i tipi di sms bancari/di transazione quindi non è efficiente, esiste un altro modo per identificare il messaggio bancario.

esempio sms:

1) Gentile Cliente, il vostro numero di conto XXXXXX6377 è stato accreditato da Rs 215.000 essere DBT/DBTL trasferimento di fondi on 19/05/2015 - BANCA CENTRALE DELL'INDIA

2) A/c NN5715 addebitato per Rs 2000; ATM WDL. A/c Bal (sub to chq realisatn) Rs13286.23 su 24APR 21: 19hr. Chiama 1800226999 per bloccare la tua carta se non utilizzata da te.

3) Gentile Cliente, La vostra Ac XXXXXXXX5666 è accreditati con INR8,922.00 il 16 febbraio Info. INF * 000080483346 * STIPENDIO. Il tuo Net Available Bal è 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; 
} 

risposta

1

Le due espressioni regolari aiutato nella ricerca di importo dalla maggior parte delle operazioni bancarie (HDFC, ICICI, ING, Kotak, SBI, Canara, PNB):

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

Si prega di commentare se avete capito espressioni molto migliori di quelle sopra.

+0

grazie per un swer è questo regx darà informazioni separate transazione –

+0

grazie, ma ottengo solo prima cifra di importo utilizzando [Ii] [Nn] [Rr] (\\ s *. \\ s * \\ d *) espressione reguler.come posso io Ottieni tutte le cifre –

9

Per scoprire l'importo dal messaggio di transazione bancaria.

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

Per trovare il nome del commerciante dal messaggio di transazione bancaria.

(?i)(?:\sat\s|in\*)([A-Za-z0-9]*\s?-?\s?[A-Za-z0-9]*\s?-?\.?) 

Per trovare il nome della carta (debito/carta di credito) dal messaggio di transazione bancaria.

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

Funziona per me recuperare l'importo dal messaggio bancario. Ma ora voglio trovare il nome del conto da cui il mio importo viene accreditato/addebitato. es .: il mio messaggio è come "Grazie per aver utilizzato la carta di debito che termina con 1001 per Rs.2500.00 in MUMBAI a ADITYA BIRLA FASHION il 20-02-2017." Ora voglio recuperare "ADITYA BIRLA FASHION" dai messaggi bancari. quindi come farlo? –

+0

@priyankakamthe: è possibile utilizzare questo modello per il messaggio: (? I) (?: \ Sat \ s | in | on \ *) ([A-Za-z0-9] * \ s? -? \ S? [A-Za-z0-9] * \ s? -? \.?) –

+0

@VikalpPatel questo regx funziona per quei messaggi che hanno ** in ** o ** in ** o ** in **. Ma cosa succede se il messaggio contiene altro oltre a questo. Tipo: "Gentile cliente, il 30 gennaio ha effettuato un acquisto con carta di debito di INR 1.600,00. Info.VPS * AGGARWAL SH." –

0

In python seguente Regex può essere utile.

Per trovare quantità nei messaggi bancari

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

per reperire l'/ C senza

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

per rilevare eventuali messaggi transazionale in Android:

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

testato su diversi messaggi bancari