未知方程的Java正则表达式

时间:2015-03-21 15:02:13

标签: java regex expression

我正在尝试使用单行,没有空格方程作为输入,但我是regex的新手。我知道我的代码中的正则表达式是完全错误的,但它是解释我想要做的最好的方法。一些示例案例将是12 + 2 = 14,-4 + 54 = 50,5 * 8 = 40,8-2 = 10,2-4 = -6等。如果有人能告诉我,我也会非常感激如何在正则表达式中使用OR,因为我找不到任何信息。

public static void main(String[] args) {

    Scanner sc = new Scanner(System.in);
    String input = sc.next();

    String re1="((-)(\\d+))|(\\d+)";    // -int1 or int1
    String re2="((\\+) | - | (\\*))";   //+ or - or *
    String re3="((-)(\\d+))|(\\d+)";    // -int2 or int2
    String re4="(=)";                   // Equals
    String re5="((-)(\\d+))|(\\d+)";    // -int3 or int3

    Pattern pattern = Pattern.compile(re1+re2+re3+re4+re5,Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
    Matcher matcher = pattern.matcher(input);

    if (matcher.find()) {

        String int1 = matcher.group(2);
        String op1 = matcher.group(3);
        String int2 = matcher.group(4);
        String op2 = matcher.group(5);
        String int3 = matcher.group(6);
        System.out.println(int1 + " " + op2 + " " + int2 + " " + op2 + " " + int3);
    }
}

1 个答案:

答案 0 :(得分:1)

首先,我建议使用像http://www.regexr.com/这样的网站来测试您的正则表达式。

然后,而不是" OR"您可以使用可选的量词,例如([-]?\d+)匹配任何负数和正数: [-]是包含减号的集合,以下?表示集合可以出现零次或一次性(这就是为什么它被称为可选量词),然后\d+表示发生一次或多次的数字。

要对运算符进行分类,您可以使用集合[+\-*\/]。请注意,在这种情况下,-必须由\转义,因为通常在[a-n]这样的集合中找到它时,它代表an之间的范围。但在我们的例子中,它只是一组的一部分。

所以,考虑到这两部分你最终会得到这样的正则表达式:([-]?\d+)([+\-*/])([-]?\d+)=([-]?\d+)

请注意,您必须在Java字符串中转义\(我在这里没有做过,因为它主要是关于正则表达式)。