C# Regex验证逻辑&&|字符串中的运算符

C# Regex验证逻辑&&|字符串中的运算符,c#,regex,string,C#,Regex,String,我试图创建一个正则表达式来验证逻辑的&&|字符串组合及其相应的开头和结尾()括号 我一直在搞乱Regex象形文字模式,但似乎无法让它正常工作,主要是因为我完全不了解Regex模式 经过几个小时的StackOverflow和google,这就是我目前所拥有的,我觉得我已经接近了 private void ValidationTest() { string hieroglyphics = @"^(?=^[^()]*\((?>[^()]+|\((?<DEPT

我试图创建一个正则表达式来验证逻辑的
&&
|
字符串组合及其相应的开头和结尾
()
括号

我一直在搞乱Regex象形文字模式,但似乎无法让它正常工作,主要是因为我完全不了解Regex模式

经过几个小时的StackOverflow和google,这就是我目前所拥有的,我觉得我已经接近了

    private void ValidationTest()
    {
        string hieroglyphics = @"^(?=^[^()]*\((?>[^()]+|\((?<DEPTH>)|\)(?<-DEPTH>))*(?(DEPTH)(?!))\)[^()]*$)[(]*\d+[)]*(\s+(&&|\|\|)\s+[(]*\d+[)]*)*$";

        var tests = new List<string>
        {
            // Working
             "(1 && 2)",
             "((1 && 2) && (3 || 4))",
             "((1 && 2) && (3 || 4) || ((1 && 2) && (3 || 4)))",

            // Not working
            "(Stack && Overflow)"
        };

        if (tests.All(test => Regex.IsMatch(test, hieroglyphics)))
        {
            MessageBox.Show("Woohoo!!");
        }
    }
还有一些关键字包含可能会把事情搞砸的brakets 例如:

编辑: 现在,这个表达式可以很好地验证我所需要的复杂性,然而,我唯一真正的问题是,它的数量只是

用这个
Regex

"((1 && 2) && (3 || 4) || ((1 && 2) && (3 || 4)))"
一个简单的字符串
1&&2
在没有brakets的情况下无法验证,但我不介意在这些字符串中添加brakest

我所需要的是增加对单词的支持,而不仅仅是数字,如果这有帮助的话,这将是一个固定的单词列表

如果有人能发现错误或给我指出更好的方向,那就太棒了 谢谢

编辑: 答案很完美。问题似乎是
d+
需要
0-9a-zA-Z()

以下是模式,以防对其他人有用

   string hieroglyphics = @"^(?=^[^()]*(?>[^()]+|\((?<DEPTH>)|\)(?<-DEPTH>))*(?(DEPTH)(?!))[^()]*$)[(]*[0-9a-zA-Z()]+[)]*(\s+(&&|\|\|)\s+[(]*[0-9a-zA-Z()]+[)]*)*$";

我认为,如果没有换行
()
,则无法验证表达式的原因是核心嵌套逻辑中的换行括号。如果去掉我在下面注意到的以下括号,那么其他两个非包装表达式将进行验证:

^(?=^[^()]*\((?>[^()]+|\((?<DEPTH>)|\)(?<-DEPTH>))*(?(DEPTH)(?!))\)[^()]*$...
           ^^ remove this                            remove this ^^
因此,它将成为:

...[(]*[0-9a-zA-Z]+[)]*(\s+(&&|\|\|)\s+[(]*[0-9a-zA-Z]+[)]*)*$

演示:

正则表达式中的“regular”指的是正则表达式可以接受的受限语言类,最简单(并非完全不准确)的描述是它们对应于一个不能计数的有限状态机。因此,在真正的regexp语言中,不可能将括号匹配到任意深度。这个问题无法用正则表达式解决,除非您的输入字符串限制为固定数量的嵌套括号深度。如果希望支持不定数量的嵌套括号,则不能使用正则表达式。为此,您需要编写一个小型自定义解析器。我同意@SinaIravanian的观点,这不是正则表达式可以解决的问题。研究编写解析器和/或语法。实际上,我也为这个问题做了类似的事情,结果很好。sting是在另一个应用程序中使用
CodeDom
编译的,目前我正在使用相同的
CodeDom
方法进行验证,你可以想象它相当慢/愚蠢,我只是希望得到一个简单的
Regex
解决方案,如果可以使用
Regex
或每个字符串的嵌套braket对数量必须相同,我不介意对嵌套brakets设置深度限制。那么平衡组定义呢?
 "IsPlayer(Video) && Player(Playing)",
 "((IsPlayer(Video) && (Player(Playing) && ControlIsVisible(34))) || (IsPlayer(Video) && (Player(Playing) && ControlIsVisible(34)))) && ControlIsFocused(22)"
^(?=^[^()]*\((?>[^()]+|\((?<DEPTH>)|\)(?<-DEPTH>))*(?(DEPTH)(?!))\)[^()]*$...
           ^^ remove this                            remove this ^^
...[(]*\d+[)]*(\s+(&&|\|\|)\s+[(]*\d+[)]*)*$
       ^^ change these expression ^^
...[(]*[0-9a-zA-Z]+[)]*(\s+(&&|\|\|)\s+[(]*[0-9a-zA-Z]+[)]*)*$