Yar*_*evi 8 c# regex parsing boolean-logic boolean
我想在C#中验证一个包含带括号的布尔表达式的字符串.该字符串应仅包含数字1-9,圆括号,"OR","AND".
良好字符串的示例:
"1和2"
"2 OR 4"
"4 AND(3 OR 5)"
"2"
等等...
我不确定正则表达式是否足够灵活地完成此任务.在C#中有一个很好的简短方法吗?
使用简单的解析器执行此操作可能更简单.但是你可以使用.NET regex通过使用平衡组来实现这一点,并意识到如果从字符串中删除括号,你总是有一个字符串匹配一个简单的表达式,如^\d+(?:\s+(?:AND|OR)\s+\d+)*\z
.
因此,您所要做的就是使用平衡组来确保括号是平衡的(并且在正确的位置中位于正确的位置).
重写上面的表达式:
(?x)^
OPENING
\d+
CLOSING
(?:
\s+(?:AND|OR)\s+
OPENING
\d+
CLOSING
)*
BALANCED
\z
Run Code Online (Sandbox Code Playgroud)
((?x)
使正则表达式引擎忽略模式中的所有空格和注释,因此可以使其更具可读性.)
在哪里OPENING
匹配任何数字(包括0)的左括号:
\s* (?: (?<open> \( ) \s* )*
Run Code Online (Sandbox Code Playgroud)
CLOSING
匹配任意数量的结束括号,同时确保平衡组是平衡的:
\s* (?: (?<-open> \) ) \s* )*
Run Code Online (Sandbox Code Playgroud)
并BALANCED
执行平衡检查,如果有更多的开括号然后关闭则失败:
(?(open)(?!))
Run Code Online (Sandbox Code Playgroud)
表达方式:
(?x)^
\s* (?: (?<open> \( ) \s* )*
\d+
\s* (?: (?<-open> \) ) \s* )*
(?:
\s+(?:AND|OR)\s+
\s* (?: (?<open> \( ) \s* )*
\d+
\s* (?: (?<-open> \) ) \s* )*
)*
(?(open)(?!))
\z
Run Code Online (Sandbox Code Playgroud)
如果你不想允许随机空格删除每一个\s*
.
请参阅IdeOne上的演示.输出:
matched: '2'
matched: '1 AND 2'
matched: '12 OR 234'
matched: '(1) AND (2)'
matched: '(((1)) AND (2))'
matched: '1 AND 2 AND 3'
matched: '1 AND (2 OR (3 AND 4))'
matched: '1 AND (2 OR 3) AND 4'
matched: ' ( 1 AND ( 2 OR ( 3 AND 4 ) )'
matched: '((1 AND 7) OR 6) AND ((2 AND 5) OR (3 AND 4))'
matched: '(1)'
matched: '(((1)))'
failed: '1 2'
failed: '1(2)'
failed: '(1)(2)'
failed: 'AND'
failed: '1 AND'
failed: '(1 AND 2'
failed: '1 AND 2)'
failed: '1 (AND) 2'
failed: '(1 AND 2))'
failed: '(1) AND 2)'
failed: '(1)() AND (2)'
failed: '((1 AND 7) OR 6) AND (2 AND 5) OR (3 AND 4))'
failed: '((1 AND 7) OR 6) AND ((2 AND 5 OR (3 AND 4))'
failed: ''
Run Code Online (Sandbox Code Playgroud)