-1

我想用正则表达式检查给定的逻辑公式。
这种形式的逻辑连接词是 & (and) , | (or), (!) 否定符号(允许多个否定)和变量是正常字符序列,后跟基数 [0],[1],[0..1]。
变量名也可以是“FGH”或“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]

除变量及其基数外,每个元素之间也应允许有空格。

4

1 回答 1

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
于 2013-05-24T12:30:11.837 回答