我正在考虑使用Java中的正则表达式来验证由字母表作为操作数和+-*/$
作为运算符[例如:A+B-(C/D)$(E+F)
]的中缀表示法。有没有更好的方法?我可以使用任何正则表达式吗?
答案 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程序,它检查有效字符,还包括一个检查不平衡(可能是嵌套)括号的函数:
)
这不会验证语法,但可能会作为第一个过滤明显不良字符串的测试。