使用正则表达式验证数学表达式?

时间:2012-06-13 06:27:19

标签: regex

我想使用正则表达式验证数学表达式。数学表达式可以是这个

  1. 可以为空白表示未输入任何内容

  2. 如果指定,它将始终以运营商+-*/开头,并且后面始终会跟一个可以拥有的号码 任意数量的数字和数字可以是十进制(数字之间包含.)或整数(数字中没有'。'符号)。 示例:*0.9+22.36- 90/ 0.36365

  3. 然后可以接着是第2点(上面一行)中提到的内容。 示例:*0.9+5+22.36*4/56.33-90+87.25/22/0.36365/4+2.33

  4. 请帮帮我。

3 个答案:

答案 0 :(得分:18)

这样的事情应该有效:

^([-+/*]\d+(\.\d+)?)*

Regexr Demo

  • ^ - 字符串的开头
  • [-+/*] - 其中一个运营商
  • \d+ - 一个或多个数字
  • (\.\d+)? - 一个可选的点后跟一个或多个数字
  • ()* - 整个表达重复零次或多次

答案 1 :(得分:0)

如果你想要消极或积极的表达,你可以像这样写>
^\-?[0-9](([-+/*][0-9]+)?([.,][0-9]+)?)*?$

还有第二个 ^[(]?[-]?([0-9]+)[)]??([(]?([-+/*]([0-9]))?([.,][0-9]+)?[)]?)*$

在表达式中使用括号但不计算数字,您将需要验证它或正则表达式的方法。 //方法

 public static bool IsPairParenthesis(string matrixExpression)
    {
        int numberOfParenthesis = 0;
        foreach (char character in matrixExpression)
        {
            if (character == '(')
            {
                numberOfParenthesis++;
            }
            if (character == ')')
            {
                numberOfParenthesis--;
            }
        }

        if (numberOfParenthesis == 0)
        { return true; }
        return false;
    }

答案 2 :(得分:-1)

这是Java正则表达式,但这仅在没有大括号的情况下

[+\-]?(([0-9]+\.[0-9]+)|([0-9]+\.?)|(\.?[0-9]+))([+\-/*](([0-9]+\.[0-9]+)|([0-9]+\.?)|(\.?[0-9]+)))*

这也用Java代码中的花括号
在这种情况下,我将(..)放在数字(..)上,应该匹配而不用大括号模式

    //  without brace pattern
    static Pattern numberPattern = Pattern.compile("[+\\-]?(([0-9]+\\.[0-9]+)|([0-9]+\\.?)|(\\.?[0-9]+))([+\\-/*](([0-9]+\\.[0-9]+)|([0-9]+\\.?)|(\\.?[0-9]+)))*");
    static Pattern bracePattern = Pattern.compile("\\([^()]+\\)");

    public static boolean matchesForMath(String txt) {

        if (txt == null || txt.isEmpty()) return false;
        txt = txt.replaceAll("\\s+", "");
        if (!txt.contains("(") && !txt.contains(")")) return numberPattern.matcher(txt).matches();
        if (txt.contains("(") ^ txt.contains(")")) return false;
        if (txt.contains("()")) return false;

        Queue<String> toBeRematch = new ArrayDeque<>();
        toBeRematch.add(txt);
        while (toBeRematch.size() > 0) {
            String line = toBeRematch.poll();
            Matcher m = bracePattern.matcher(line);
            if (m.find()) {
                String newline = line.substring(0, m.start()) + "1" + line.substring(m.end());
                String withoutBraces = line.substring(m.start() + 1, m.end() - 1);
                toBeRematch.add(newline);
                if (!numberPattern.matcher(withoutBraces).matches()) return false;
            }

        }
        return true;
    }