9

正規表現を使用して数式を検証したい。数式はこれである可能性があります

  1. 空白にすることは、何も入力されないことを意味します

  2. 指定した場合、常に演算子+or-または*orで始まり、/その後に任意の桁数の数字が続き、数字は10進数(数字の間に含ま.れる)または整数(数字の間に含まれる)または整数(「。」記号なし)になります。番号)。例:*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+)?)*

正規表現のデモ

  • ^-文字列の先頭
  • [-+/*]-これらの演算子の1つ
  • \d+-1つ以上の数字
  • (\.\d+)?-オプションのドットとそれに続く1つ以上の数字
  • ()*-式全体が0回以上繰り返された
于 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]+)?)*?$

そして2つ目
^[(]?[-]?([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 に答える