9

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

  1. 它可以是空白的,意味着没有输入任何内容

  2. 如果指定,它将始终以运算符+or-*or开头,/并且始终后跟一个可以有任意位数的数字,并且该数字可以是十进制(包含.在数字之间)或整数(没有“。”符号内数字)。例子:*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

4 回答 4

23

像这样的东西应该工作:

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

正则表达式演示

  • ^- 字符串的开头
  • [-+/*]- 这些运营商之一
  • \d+- 一个或多个数字
  • (\.\d+)?- 一个可选的点,后跟一个或多个数字
  • ()*- 整个表达式重复零次或多次
于 2012-06-13T06:35:11.630 回答
1

您可以尝试使用moo等生成这样的正则表达式:

(?:(?:((?:(?:[ \t]+))))|(?:((?:(?:\/\/.*?$))))|(?:((?:(?:(?<![\d.])[0-9]+(?![\d.])))))|(?:((?:(?:[0-9]+\.(?:[0-9]+\b)?|\.[0-9]+))))|(?:((?:(?:(?:\+)))))|(?:((?:(?:(?:\-)))))|(?:((?:(?:(?:\*)))))|(?:((?:(?:(?:\/)))))|(?:((?:(?:(?:%)))))|(?:((?:(?:(?:\()))))|(?:((?:(?:(?:\)))))))

此正则表达式匹配任意数量的 int、float、大括号、空格和操作符+-*/%

但是,诸如此类2+的表达式仍将由正则表达式验证,因此您可能希望改用解析器。

于 2021-08-20T02:09:10.753 回答
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;
    }
于 2017-11-25T18:49:29.257 回答
-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;
    }
于 2020-06-25T16:03:22.670 回答