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]+[)]*)*$