我想用正则表达式检查给定的逻辑公式
这种形式的逻辑连接词是& (和),| (或),(!)否定符号(允许多个否定),变量是正常的字符序列,后跟基数[0],[1],[0..1]。
变量名也可以是这样的“F.G.H.”或“F:G:H:”或简单的“F”等
方括号属于红衣主教。允许使用常数,例如
使用这种模式它不起作用:
Pattern.compile("([!]*[a-zA-Z][\\.])?([!]*[a-zA-Z][\\.]?)*((\\[0\\])?|(\\[1\\])?|(\\[0\\.\\.1\\])?)|(TRUE)|(FALSE)|(&)|(|)|(!)");
我目前的情况是这样的变量:!! F [0]不被接受,但我希望这被接受。
这里是配方器的一些例子,我想允许
!! F [0]& !F1.G [0..1] | (F1 [1] | F2 [0])& F:G [0..1]
每个元素之间也有空格,除了变量和它们的基数之外都应该被允许。
答案 0 :(得分:1)
这一次非常糟糕,但应该符合您的需求:
[!(]*([A-Z]+[0-9]*([.:][A-Z]+[0-9]*)*\[([01]|0[.]{2}1)\]|TRUE|FALSE)[)]*( *[&|] *[!(]*([A-Z]+[0-9]*([.:][A-Z]+[0-9]*)*\[([01]|0[.]{2}1)\]|TRUE|FALSE)[)]*)*
请注意,只需允许括号而不计算它们,即!((!(F[0])
等输入将匹配,而!((!(F[0])))
只应该匹配。
如果你想要更清洁的东西,你可以
String atomVarPref = "[!(]*";
String atomVar = "[A-Z]+[0-9]*";
String atomSep = "[.:]";
String atomVarCard = "\\[([01]|0[.]{2}1)\\]";
String atomVarSuff = "[)]*";
String sep = " *[&|] *";
String varTemplate = "%s(%s(%s%s)*%s|TRUE|FALSE)%s";
String var = String.format(varTemplate, atomVarPref, atomVar, atomSep, atomVar, atomVarCard, atomVarSuff);
String regexTemplate = "%s(%s%s)*";
String regex = String.format(regexTemplate, var, sep, var);
通话:
String input = "!!F[0] & !F1.G[0..1] | (F1[1] | F2[0]) & F:G[0..1]";
System.out.println(input.matches(regex)); // prints true