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

本文关键字:amp 运算符 字符串 验证 Regex | 更新日期: 2023-09-27 17:57:44

我正在尝试创建一个Regex表达式来验证逻辑&& ||字符串组合及其相应的左括号和右括号()

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

经过几个小时的StackOverflow和谷歌搜索,这就是我迄今为止所拥有的,我觉得我已经接近了。

    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!!");
        }
    }

所以到目前为止,我所拥有的主要问题是,如果没有括号1 && 2,它将不会验证,(1 && 2) && (3 || 4)也是如此。此外,它似乎忽略了单词alltogeter (Stack && Overflow)

我正在字符串中验证的一些字符串的示例。

"IsRecording && IsPlaying"
"IsVisible && (IsPlaying && (IsMusic || IsRadio))"

还有一些关键词包含刹车,可能会把事情搞砸示例:

"IsWindowVisible(2) && (IsControlVisible(22) && IsControlFocused(100))"

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

使用此Regex 验证良好的复杂示例

"((1 && 2) && (3 || 4) || ((1 && 2) && (3 || 4)))"

一个简单的字符串1 && 2在没有刹车的情况下无法验证,但我不介意在这些字符串中添加brakest。

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

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

编辑:

mellamokb的回答非常完美。问题似乎是d+需要成为0-9a-zA-Z()

这是一个模式,以防对其他人有用。

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

它准确地验证了我所需要的

示例:

 "IsPlayer(Video) && Player(Playing)",
 "((IsPlayer(Video) && (Player(Playing) && ControlIsVisible(34))) || (IsPlayer(Video) && (Player(Playing) && ControlIsVisible(34)))) && ControlIsFocused(22)"

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

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

^(?=^[^()]*'((?>[^()]+|'((?<DEPTH>)|')(?<-DEPTH>))*(?(DEPTH)(?!))')[^()]*$...
           ^^ remove this                            remove this ^^

然后,为了允许表达式不仅仅是数字表达式,您需要用更自由的定义来替换限制性的'd,比如[0-9a-zA-Z]:

...[(]*'d+[)]*('s+(&&|'|'|)'s+[(]*'d+[)]*)*$
       ^^ change these expression ^^

所以它会变成:

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

演示:http://ideone.com/jwkcpL