2010-06-04 13 views
6

मेरे पास एक स्ट्रिंग है;जावा 0 स्ट्रिंग से निकालें

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

मैं कैसे विभाजित कर सकते हैं/इस स्ट्रिंग कोष्टक अंदर से तार्किक मान निकालने के रूप में;

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

कोई विचार? सभी का स्वागत है

उत्तर

7

यह कुछ क्लीवर नियमित अभिव्यक्ति का उपयोग करके नहीं किया जा सकता है (नियमित अभिव्यक्ति "कोष्ठक की गणना नहीं कर सकती")। आपका सबसे अच्छा विकल्प कुछ पार्सर जनरेटर का उपयोग करना है और स्ट्रिंग को abstract syntax tree (संक्षिप्त के लिए एएसटी) में पार्स करना है।

उदाहरण के लिए JFlex/JavaCUP पर एक नज़र डालें।

// 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

धन्यवाद, मैं इसे देख रहा हूं। – Adnan

+0

आपको पछतावा नहीं होगा। जटिल पार्सिंग आसानी से करने की बात आती है जब पार्सर जेनरेटर वास्तव में उपयोगी होते हैं। – aioobe

4

आप JavaCC के साथ अपने अभिव्यक्ति मॉडल के लिए एक पार्सर उत्पन्न कर सकते हैं, उदाहरण के लिए और उसके बाद में अभिव्यक्ति स्ट्रिंग पार्स:


यह पता चला है के रूप में, CUP manual वास्तव में अपनी स्थिति को कवर करने के लिए एक उदाहरण है एक अभिव्यक्ति पेड़।

संबंधित मुद्दे