2010-06-04 34 views
6

Ho una stringa;Estratto da una stringa in Java

String value = "(5+5) + ((5+8 + (85*4))+524)"; 

Come posso dividere/estrarre i valori logici da questa stringa all'interno parentesi come;

(85*4) as one 
(5+8 + one) as two 
(two+524) as three 
((5+5) + three) as four 
... 

Qualche idea? tutto è il benvenuto

risposta

7

Questo non può essere fatto usando alcune espressioni regolari di cleaver (le espressioni regolari non possono "contare le parentesi"). L'opzione migliore è utilizzare un generatore di parser e analizzare la stringa in un abstract syntax tree (AST in breve).

Dai un'occhiata a JFlex/JavaCUP per esempio.


Come si è visto, la CUP manual ha in realtà un esempio che copre la situazione:

// CUP specification for a simple expression evaluator (w/ actions) 

import java_cup.runtime.*; 

/* Preliminaries to set up and use the scanner. */ 
init with {: scanner.init();    :}; 
scan with {: return scanner.next_token(); :}; 

/* Terminals (tokens returned by the scanner). */ 
terminal   SEMI, PLUS, MINUS, TIMES, DIVIDE, MOD; 
terminal   UMINUS, LPAREN, RPAREN; 
terminal Integer NUMBER; 

/* Non-terminals */ 
non terminal   expr_list, expr_part; 
non terminal Integer expr; 

/* Precedences */ 
precedence left PLUS, MINUS; 
precedence left TIMES, DIVIDE, MOD; 
precedence left UMINUS; 

/* The grammar */ 
expr_list ::= expr_list expr_part 
      | 
       expr_part; 

expr_part ::= expr:e 
      {: System.out.println("= " + e); :} 
       SEMI    
      ; 

expr  ::= expr:e1 PLUS expr:e2  
      {: RESULT = new Integer(e1.intValue() + e2.intValue()); :} 
      | 
       expr:e1 MINUS expr:e2  
       {: RESULT = new Integer(e1.intValue() - e2.intValue()); :} 
      | 
       expr:e1 TIMES expr:e2 
      {: RESULT = new Integer(e1.intValue() * e2.intValue()); :} 
      | 
       expr:e1 DIVIDE expr:e2 
      {: RESULT = new Integer(e1.intValue()/e2.intValue()); :} 
      | 
       expr:e1 MOD expr:e2 
      {: RESULT = new Integer(e1.intValue() % e2.intValue()); :} 
      | 
       NUMBER:n     
      {: RESULT = n; :} 
      | 
       MINUS expr:e    
      {: RESULT = new Integer(0 - e.intValue()); :} 
      %prec UMINUS 
      | 
       LPAREN expr:e RPAREN  
      {: RESULT = e; :} 
      ; 
+0

Grazie, ci sto guardando. – Adnan

+0

Non te ne pentirai. I generatori di parser sono davvero utili quando si tratta di eseguire facilmente l'analisi complessa. – aioobe

4

È possibile generare un parser per il modello di espressione, per esempio con JavaCC e poi analizzare la stringa di espressione in un albero di espressione.