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)"
我认为在没有包装()
的情况下无法验证表达式的原因是核心嵌套逻辑中的包装括号。如果去掉我在下面注意到的以下括号,那么其他两个非包装表达式将生效:
^(?=^[^()]*'((?>[^()]+|'((?<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