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

时间:2015-02-20 10:37:58

标签: c# regex logic

我遇到了一个困扰我的问题,我无法弄清楚如何在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)
  4. 另一方面,我想打破这个公式,它的两个部分公式及其操作数。现在,我有两个二元运算符(或,和)和一个一元运算符(不是)。

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

    谢谢, 奥托

2 个答案:

答案 0 :(得分:1)

这个问题只是解决方案。 Reverse Polish Notation (RPN) 将字符串转换为RNP,然后执行它。

答案 1 :(得分:0)

Otto,不知道你为什么要这样做,我不知道一串字符串是否是最好的方法;问题是,如果你只有一个数组"(真或假)"等等,你失去了原始表达的结构。我的解决方案使用从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);
        }
    }
  }
}