6

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

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

经过几个小时的 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). 它似乎也忽略了所有单词(Stack && Overflow)

我试图验证的一些字符串的示例。

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

还有一些关键字包含可能会搞砸的小括号示例:

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

编辑: 因为现在这个表达式可以很好地验证我需要的那种复杂性,但是我唯一真正的问题是它只有 nubers。

可以很好地验证的复杂示例Regex

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

一个简单的字符串1 && 2不会在没有括号的情况下验证,但我不介意在这些字符串中添加括号。

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

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

编辑:

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)"
4

1 回答 1

1

我认为您无法在没有包装的情况下验证表达式的原因是()核心嵌套逻辑中的包装括号。如果您取出我在下面记下的以下括号,则其他两个非包装表达式将有效:

^(?=^[^()]*\((?>[^()]+|\((?<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

于 2013-02-06T00:01:22.357 回答