Extract from strings in Java

I have a string;

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

How to split / extract the logical value from this string in parentheses is;

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

Any ideas? Everything is very popular

Solution

This cannot be done using some cutter regular expressions (regular expressions cannot "evaluate parentheses") Your best choice is to use some parser generators and parse the string into abstract syntax tree (AST)

For example, see jflex / javacup

It turns out that cup manual actually has an example covering your situation:

// 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,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; :} 
          ;
The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
分享
二维码
< <上一篇
下一篇>>