2010-06-04 3 views
6

У меня есть строка;Извлечение из строки в Java

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 (AST для краткости).

Посмотрите на JFlex/JavaCUP например.


Как выясняется, CUP manual на самом деле есть пример, охватывающий ситуацию:

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

Вы не пожалеете об этом. Генераторы Parser действительно полезны, когда дело доходит до простого простого анализа. – aioobe

4

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

Смежные вопросы