【发布时间】:2017-09-03 22:47:47
【问题描述】:
我有一定的逻辑命题,我想用 C# 中的正则表达式检查它们的有效性。
每个大写字母都是一个谓词。谓词逻辑公式由谓词和连接词构成,如 ¬、⇒、⇔、⋀ 和 ⋁。但是用户输入应该是 ASCII 字符串表示法,即:
Logical notation ASCII
¬A ~(A) Negation
A ⇒ B >(A,B) Implication
A ⇔ B =(A,B) Bi-Implication
A ⋀ B &(A,B) AND
A ⋁ B |(A,B) OR
此外,True 和 False 用 0 和 1 表示,如下所示:&(0,1)
假设我有以下 ASCII 输入
string input1 = "&(&(=(A,B),>(&(A,B),~(C))),>(A,~(&(A,B))))"; // valid
string input2 = "1" // valid
string input3 = "=(~(A),>(>(B,C),~(A)))" // valid
string input4 = "(~(A))" // invalid because no connective in the beginning
string input5 = ">(A,B" // invalid because no closing parenthesis
所以,ascii 字符串应该是
- 单个谓词 - A-Z 或 0-1
- 以连接词开头并包含两个用逗号分隔的命题的字符串,这些命题可以是单个谓词,也可以是包含两个命题的连接词...
我想出了这个:
Regex checkExpression = new Regex(
@"([&|>=]\(([A-Z0-1]{1}|\(.*\)),([A-Z0-1]{1}|\(.*\))\))
|([~]\(([A-Z0-1]{1}|\(.*\))\))");
但是,我对构建正则表达式不是很熟悉,感谢任何帮助。
【问题讨论】:
-
您实际上必须使用执行递归或理解平衡(嵌套)文本分隔符的正则表达式。这并不难,但有点棘手。
-
PCRE 示例regex101.com/r/aq3NK0/1