可能使用正则表达式验证中缀表示法
我正在考虑验证由字母作为操作数和 +-*/$
作为运算符组成的中缀表示法 [例如:A+B-(C/D)$(E+F)
] 在 Java 中使用正则表达式。还有更好的办法吗?有我可以使用的正则表达式模式吗?
I am thinking of validating an infix notation which consists of alphabets as operands and +-*/$
as operators [eg: A+B-(C/D)$(E+F)
] using regex in Java. Is there any better way? Is there any regex pattern which I can use?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我不熟悉
infix
的语言语法,但是您当然可以进行首次通过验证检查,它只是验证字符串中的所有字符是否有效(即可接受的字符 =AZ
、+
、-
、*
、/
、$
、(
和)
)。这是一个检查有效字符的 Java 程序,还包含一个检查不平衡(可能嵌套)括号的函数:这不会验证语法,但作为过滤掉明显错误字符串的第一个测试可能很有用。
I am not familiar with the language syntax of
infix
, but you can certainly do a first pass validation check which simply verifies that all of the characters in the string are valid (i.e. acceptable characters =A-Z
,+
,-
,*
,/
,$
,(
and)
). Here is a Java program which checks for valid characters and also includes a function which checks for unbalanced (possibly nested) parentheses:This does not validate the grammar, but may be useful as a first test to filter out obviously bad strings.
可能有点过头了,但您可以考虑使用成熟的解析器生成器,例如 ANTLR (http://www.antlr.org/)。使用 ANTLR,您可以创建规则来自动生成 java 代码。假设您在输入中仅获得有效字符,这是一个语法分析问题,否则您需要首先使用词法分析来验证字符流。
对于语法分析,您可能有这样的规则:
常量是整数/实数。如果 ANTLR 生成的解析器代码无法将输入与解析器规则相匹配,它将抛出异常,以便您可以确定代码是否有效。
Possibly overkill, but you might consider using a fully fledged parser generator such as ANTLR (http://www.antlr.org/). With ANTLR you can create rules that will generate the java code for you automatically. Assuming you have only got valid characters in the input this is a syntax analysis problem, otherwise you would want to validate the character stream with lexical analysis first.
For syntax analysis you might have rules like:
With constant being integers/reals whatever. If the ANTLR generated parser code can't match the input with your parser rules it will throw an exception so you can determine whether code is valid.
你也许可以用递归PCRE来做到这一点..但这可能是一个PITA。
由于您只想验证它,因此可以非常简单。只需使用堆栈,将所有元素一一压入并删除有效表达式。
定义一些规则,例如:
:
在每次删除表达式后删除该表达式,然后添加一个虚拟字母表。重复前面的步骤。
如果结果是字母表,则表达式有效。
或者类似的东西..
You probably could do it with recursive PCRE..but this may be a PITA.
since you only want to validate it, you can do it very simple. just use a stack, push all the elements one by one and remove valid expressions.
define some rules, for example:
then:
after every removal of an expression, add an dummy alphabet. repeat the previous steps.
if the result is an alphabet, the expression is valid.
or something like that..