むかしむかし、C#の数式のパーサーが必要でした。 もちろん、完成した実装をダウンロードすることは問題ではありません。 しかし、その年にのみ、私はインターネットを持っていませんでした。 その結果、完全にためらいもなく、パーサー、ステートマシン、その他の理論的基礎もなしに、正規表現で記述されました。 10分。算術演算と括弧のみが必要だったことは注目に値します。 三角関数などのサポートは不要でした。
まず、数値とアクションの正規表現を強調します。
private const string RegexBr = "\\(([1234567890\\.\\+\\-\\*\\/^%]*)\\)";
次に、結果の文字列を要素に分割し、それらを再帰的に計算するメソッド:
public static double Parse(string str) {
最後に、アクションの値を直接計算するメソッドを作成します。
private static double ParseAct(Match match) { double a = double.Parse(match.Groups[1].Value, CultureInfo.InvariantCulture); double b = double.Parse(match.Groups[3].Value, CultureInfo.InvariantCulture); switch (match.Groups[2].Value) { case "+": return a + b; case "-": return a - b; case "*": return a * b; case "/": return a / b; case "^": return Math.Pow(a, b); case "%": return a % b; default: throw new FormatException($" '{match.Value}'"); } }
そのような「異常なプログラミング」がありました。 私はソースコードに完全に何も見当たりません-誰もそれをほとんど必要としません。 ただし、いずれにしても、3つのクラスを作成するのは数秒で完了します。
ご清聴ありがとうございました。