gpt4 book ai didi

c# - 在 C# 中验证带括号的 boolean 表达式

转载 作者:太空狗 更新时间:2023-10-29 19:39:35 25 4
gpt4 key购买 nike

我想在 C# 中验证包含带括号的 boolean 表达式的字符串。该字符串应仅包含数字 1-9、圆括号、“OR”、“AND”。

好的字符串示例:

“1 和 2”

“2 或 4”

“4 和(3 或 5)”

“2”

等等……

我不确定正则表达式是否足够灵活来完成这项任务。在 C# 中是否有一个很好的简短方法来实现这一点?

最佳答案

使用简单的解析器可能更简单。但是你can do this使用 .NET 正则表达式 balancing groups并意识到如果从字符串中删除括号,您总是有一个字符串与一个简单的表达式匹配,如 ^\d+(?:\s+(?:AND|OR)\s+\d+)*\z.

因此,您所要做的就是使用平衡组来确保括号是平衡的(并且以正确的形式位于正确的位置)。

稍微重写一下上面的表达式:

(?x)^
OPENING
\d+
CLOSING
(?:
\s+(?:AND|OR)\s+
OPENING
\d+
CLOSING
)*
BALANCED
\z

((?x) 使正则表达式引擎忽略模式中的所有空格和注释,因此可以使其更具可读性。)

OPENING 匹配任意数量(包括 0)的左括号:

\s* (?: (?<open> \( ) \s* )*

CLOSING 匹配任意数量的右括号,同时确保平衡组是平衡的:

\s* (?: (?<-open> \) ) \s* )*

BALANCED 执行平衡检查,如果有更多的左括号然后闭合则失败:

(?(open)(?!))

给出表达式:

(?x)^
\s* (?: (?<open> \( ) \s* )*
\d+
\s* (?: (?<-open> \) ) \s* )*
(?:
\s+(?:AND|OR)\s+
\s* (?: (?<open> \( ) \s* )*
\d+
\s* (?: (?<-open> \) ) \s* )*
)*
(?(open)(?!))
\z

如果您不想允许随机空格,请删除每个 \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: ''

关于c# - 在 C# 中验证带括号的 boolean 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12553353/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com