Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 字符串中的布尔运算符_C#_Regex_Replace - Fatal编程技术网

C# 字符串中的布尔运算符

C# 字符串中的布尔运算符,c#,regex,replace,C#,Regex,Replace,我正在尝试向或运算符的操作数添加括号。例如,如果我有如下陈述 C>O AND C>4 OR C>0 AND C>5 我想把它格式化如下 (C>O AND C>4) OR (C>0 AND C>5) 我编写了一个简单的代码,如下所示。但是,如果字符串包含多个或语句,则代码无法正常工作。我被告知正则表达式可以实现这一点。但我对正则表达式的了解很少 string mystring = "C>O AND C>4 OR C>0 AND

我正在尝试向
运算符的操作数添加括号。例如,如果我有如下陈述

C>O AND C>4 OR C>0 AND C>5
我想把它格式化如下

(C>O AND C>4) OR (C>0 AND C>5)
我编写了一个简单的代码,如下所示。但是,如果字符串包含多个
语句,则代码无法正常工作。我被告知正则表达式可以实现这一点。但我对正则表达式的了解很少

string mystring = "C>O AND C>4 OR C>0 AND C>5";
int indexFound = mystring.IndexOf("OR");
string left = mystring.Substring(0, indexFound - 1);
string right = mystring.Substring(indexFound + 2, mystring.Length - (indexFound + 2));
string output = "(" + left + ")" + "OR" + "(" + right + ")";

任何帮助都将不胜感激。

您目前没有在代码中使用任何正则表达式

.Substring()
方法在
mystring
中查找第一个
,并将其拆分为
子字符串。因此,只有第一个
可以按照您描述的方式处理

您必须在
mystring
上创建一个循环,直到不再出现

示例代码

string mystring = "C>O AND C>4 OR C>0 AND C>5";
string output = "";

int indexFound = mystring.IndexOf("OR");

// indexOf returns -1 if the string cannot be found.
// We quit our loop once -1 is returned.
while (indexFound > -1)
{
    // Compute the "left" side of our current mystring.
    string left = mystring.Substring(0, indexFound - 1);

    // And then append it to our final output variable.
    output += "(" + left + ")" + "OR";

    // Instead of directly adding the "right" side, we
    // "shorten" mystring to only contain the right side.
    // This effectively "skips" over the "left" and "OR"
    // and will allow us to process the remaining "OR"s.
    mystring = mystring.Substring(indexFound + 2)

    // Finally, we update indexFound to check if there
    // are any more "OR"s inside our mystring.
    indexFound = mystring.IndexOf("OR");
}

// Before returning, we add the remaining mystring to
// our output.  You have to decide whether you want
// to add the parentheses here.
output += "(" + mystring + ")";

希望能有所帮助。

下面是通过正则表达式实现的方法:

static string AddBracketsToOr(string input)
{            
    Regex regex = new Regex(@"(?<left>.+[AND|OR].+) OR (?<right>.+[AND|OR].+)");
    Match match = regex.Match(input);

    if (match == null)
        throw new Exception("Wrong input format");

    return String.Format("({0}) OR ({1})", 
                         match.Groups["left"], match.Groups["right"]);
}
更新: 配合

"C>O AND C>4 OR C>0 AND C>5" // (C>O AND C>4) OR (C>0 AND C>5)
"C>9 OR C>O AND C>4 OR C>0 AND C>5" // (C>9 OR C>O AND C>4) OR (C>0 AND C>5)
"C>9 OR C>O OR C>0 AND C>5" // (C>9 OR C>O) OR (C>0 AND C>5)

坦白地说,我会使用一个合适的表达式解析器来构建一棵树,然后编写规范化的树——我认为“分流场”可能需要一个理解操作符优先级的词汇标记器。。。这不是一项简单的任务。如果字符串包含多个OR语句,例如
C>9或C>O或C>0和C>5,您希望看到什么行为?它可以是
(C>9或C>O)或(C>0和C>5)
(C>9)或(C>O或C>0和C>5)
,甚至
((C>9)或(C>O))或(C>0和C>5)
那么
C>9或C>O和C>4或C>0和C>5
呢?这不是问题的问题,但您可以这样更改正则表达式
(?.AND.+)或(?+)
为了确保
在这两个部分中都存在,如果我否决了你,我会取消它,但这并不能改变一个事实,即你不能仅仅用正则表达式生成表达式计算器(美化器)。如果表达式更复杂(
s等),那该怎么办?抱歉,在开始时没有看到,这个问题是关于一个字符串中的多个或多个语句。我同意你的观点,表达式树的构建不适用于正则表达式。有趣的是@balan真正希望看到的:)
"C>O AND C>4 OR C>0 AND C>5" // (C>O AND C>4) OR (C>0 AND C>5)
"C>9 OR C>O AND C>4 OR C>0 AND C>5" // (C>9 OR C>O AND C>4) OR (C>0 AND C>5)
"C>9 OR C>O OR C>0 AND C>5" // (C>9 OR C>O) OR (C>0 AND C>5)