简体   繁体   English

从Java中的字符串中提取

[英]Extract from string in Java

I have a string; 我有一个字符串;

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

How can I split/extract logical values from this string inside parenthesis as; 如何从括号内的此字符串中拆分/提取逻辑值为;

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

Any idea? 任何想法? all is welcome 一切都很受欢迎

This cannot be done using some cleaver regular expression (regular expressions can not "count parenthesis"). 这不能使用一些切割器正则表达式来完成(正则表达式不能“计算括号”)。 Your best option is to use some parser generator and parse the string into an abstract syntax tree (AST for short). 您最好的选择是使用一些解析器生成器并将字符串解析为抽象语法树 (简称AST)。

Have a look at JFlex / JavaCUP for instance. 例如,看看JFlex / JavaCUP


As it turns out, the CUP manual actually has an example covering your situation: 事实证明, CUP手册实际上有一个例子涵盖你的情况:

// 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; :} 
          ;

您可以为表达式模型生成解析器,例如使用JavaCC ,然后将表达式字符串解析为表达式树。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM