麻烦与java中的正则表达式

时间:2012-08-07 14:20:04

标签: java regex

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

每个元素之间也有空格,除了变量和它们的基数之外都应该被允许。

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)[)]*)*

Demo

请注意,只需允许括号而不计算它们,即!((!(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