根据括号将逻辑表达式字符串转换为字符串数组

convert logical expression string into string array, based on parenthesis

我有一个困扰我的问题,我不知道如何在 C# 中解决这个问题。

比方说,我有这个公式:((true or false) and (false or true))

这只是一个示例公式,但它可能会像这样复杂得多:((((true or ((((true or false) and (false or ((true or false) and (false or ((((true or false) and (false or ((true or false) and (false or true)))) or not ((true or false) and (false or ((true or false) and (false or true)))))))))) or not ((true or false) and (false or ((true or false) and (false or true))))))) and (false or ((true or false) and (false or ((((true or false) and (false or ((true or false) and (false or true)))) or not ((true or false) and (false or ((true or false) and (false or true)))))))))) or not ((true or false) and (false or ((true or false) and (false or true)))))) 等等

我想把它分成三个部分

  1. (true or false)
  2. and
  3. (false or true)

换句话说,我想把这个公式分解成它的两个部分公式和它的操作数。现在,我有两个二元运算符(或,和)和一个一元运算符(不)。

我该如何解决这个问题?你能帮我吗?我尝试过使用正则表达式和分组构造,但我不是正则表达式专家。

谢谢, 奥托

这个问题有简单的解决方法。 Reverse Polish Notation (RPN) 将您的字符串转换为 RNP,然后执行它。

Otto,不知道你为什么要这样做我不知道字符串数组是否是最好的方法;问题是,如果你只有一个“(true OR false)”等数组,你就会失去原始表达式的结构。我的解决方案使用从 0 开始的整数作为占位符来显示从表达式中提取字符串的位置。希望这可以帮助!格雷格

using System;
using System.Collections.Generic;

namespace ParseParentheses
{
    class Program
    {
        static List<string> wordList = new List<string>();
        static int wordIndex = -1;

    static void Main(string[] args)
    {
        GetChunks("(true AND (true OR false)) OR ((true AND false) OR false)");
        // Now we know how many items we have, convert the List to an array,
        // as this is what the solution specified.
        string[] words = wordList.ToArray();
        for (int i = 0; i < words.Length; i++)
        {
            Console.WriteLine(i + ":\t" + words[i]);
        }
    }

    private static void GetChunks(string text)
    {
        int start;
        int end = text.IndexOf(')');
        if (end > -1)
        {
            start = text.LastIndexOf('(', end - 1);
            if (start == -1)
            {
                throw new ArgumentException("Mismatched parentheses", text);
            }
            wordList.Add(text.Substring(start, end - start + 1));
            wordIndex++;
            text = text.Substring(0, start)
                + wordIndex.ToString()
                + text.Substring(end + 1);

            GetChunks(text);
        }
        else
        {
        // no more ) in text, just add what's left to the List.
            wordList.Add(text);
        }
    }
  }
}