在C#中使用括号验证布尔表达式

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#中有一个很好的简短方法吗?

Qta*_*tax 5

使用简单的解析器执行此操作可能更简单.但是你可以使用.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)