将算术表达式的组件与正则表达式匹配

时间:2014-01-20 22:47:22

标签: java regex

我创建了一个regular expression

((\(\s*)          #match start parens
|(\d+\.?\d*)      #match a number
|([+-/%^!])       #match operators
|([*])            #match the asterisk operator
|(\s*\)))+        #match the end parens

应该分括括号,数字(整数和小数(36.28))和运算符(+-/*^%!)。我尝试了一些测试

( (2 3 +) 6.28 +)  
(3.14 6.28 +)
( (3 4 +) (5 6 +) *)

我注意到了一些事情。当我在带有两个起始parens的表达式上运行正则表达式时,它似乎忽略了一个括号,并且在站点上进行测试似乎产生了许多null和重复字符的实例。有没有办法匹配有效的表达式并将其分配给它自己的组?例如,如果我有表达式( (2 3 +) 6.28 +),则生成的组将是:[((23+6.28+)]?

1 个答案:

答案 0 :(得分:1)

试试这个:

示例代码

public static void main(String[] args) {
    String test ="((6.28 + 3.14) + 7.56)";
    String re = "\\(|\\)|\\d+\\.?\\d*|[+-/%^!*]";

    List<String> components = new ArrayList<String>();

    Pattern p = Pattern.compile(re);
    Matcher m = p.matcher(test);

    while(m.find()) {
        components.add(m.group());
    }

    System.out.println(components);
}

输出

[(, (, 6.28, +, 3.14, ), +, 7.56, )]