可能使用正则表达式验证中缀表示法

时间:2011-04-27 13:12:18

标签: java regex infix-notation

我正在考虑使用Java中的正则表达式来验证由字母表作为操作数和+-*/$作为运算符[例如:A+B-(C/D)$(E+F)]的中缀表示法。有没有更好的方法?我可以使用任何正则表达式吗?

3 个答案:

答案 0 :(得分:0)

可能有点矫枉过正,但您可能会考虑使用完全成熟的解析器生成器,例如ANTLR(http://www.antlr.org/)。使用ANTLR,您可以创建将自动为您生成Java代码的规则。假设您在输入中只有有效字符,这是一个语法分析问题,否则您首先需要使用词法分析来验证字符流。

对于语法分析,您可能有以下规则:

PLUS : '+' ;
etc...

expression:
         term ( ( PLUS | MINUS | MULTIPLY | DIVIDE )^ term )*
      ;
term:
    constant
  | OPENPAREN! expression CLOSEPAREN!
  ;

随着整数/实数的不断变化。如果ANTLR生成的解析器代码与输入解析器规则不匹配,则会抛出异常,因此您可以确定代码是否有效。

答案 1 :(得分:0)

您可能可以使用递归PCRE进行此操作。但这可能是PITA。

因为您只想验证它,所以您可以非常简单地完成它。只需使用一个堆栈,逐个推送所有元素并删除有效的表达式。

定义一些规则,例如:

  • 只有在堆栈顶部有字母
  • 时才允许运营商
  • 只有在堆栈顶部有操作员时才允许使用字母或括号
  • 如果堆栈为空,则允许一切

然后:

  • 如果您遇到关闭的括号,请将所有内容移除到前面的括号中。
  • 如果遇到字母,请删除表达式

每次删除表达式后,添加一个虚拟字母表。重复前面的步骤。 如果结果是字母表,则表达式有效。

或类似的......

答案 2 :(得分:0)

我不熟悉infix的语言语法,但您当然可以进行首次验证检查,只检查字符串中的所有字符是否有效(即可接受的字符= {{1} },A-Z+-*/$()。这是一个Java程序,它检查有效字符,还包括一个检查不平衡(可能是嵌套)括号的函数:

)

这不会验证语法,但可能会作为第一个过滤明显不良字符串的测试。