我遇到了一个困扰我的问题,我无法弄清楚如何在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))))))
等。
我想把它分成三部分
(true or false)
and
(false or true)
另一方面,我想打破这个公式,它的两个部分公式及其操作数。现在,我有两个二元运算符(或,和)和一个一元运算符(不是)。
我该如何解决这个问题?你能帮帮我吗?我尝试过使用Grouping Constructs的正则表达式,但我不是正则表达式的专家。
谢谢, 奥托
答案 0 :(得分:1)
这个问题只是解决方案。 Reverse Polish Notation (RPN) 将字符串转换为RNP,然后执行它。
答案 1 :(得分: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);
}
}
}
}