我正在尝试创建一个正则表达式来验证逻辑&&
||
字符串组合及其相应的左括号和右()
括号。
我一直在搞乱正则表达式象形文字模式,但似乎无法让它正常工作,主要是因为我完全不了解正则表达式模式。
经过几个小时的 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)"