【发布时间】:2016-02-22 17:46:33
【问题描述】:
我正在尝试确定给定的输入是否是有效的数学表达式。这是我提出的当前代码,但只有当 Input 是单个整数(例如 100、200、5、7)时才会返回 true。
Pattern pattern = Pattern.compile("-?\\w+|[-+*%/()]");
Matcher match = pattern.matcher(Input);
if(pattern.matcher(Input).matches())
{
System.out.print("True");
}
else
System.out.print("False");
关于我要完成的工作的更多信息:
为简单起见,假设 只有整数(因此没有变量和小数位)。
运算符有:+、-、*、/、%。
仅括号(因此没有括号或大括号)。
例子:
有效:
123
1*2(3+4)%7
3--4+5*-7
13(12)+11-(7*15%(11-2)/4)
(((((-99999)))))
无效
1+2)
)5--
3+*12
)(++**//
(50)+12)
另外,如果可能的话,是否也可以包含一个关于正则表达式如何工作的简单解释?我对这个话题很陌生。我从概念上理解它,但在我的代码中实现它时遇到了麻烦。
【问题讨论】:
-
(Java) 正则表达式不能做到这一点。一些正则表达式引擎确实支持此类任务所需的递归等功能,但 Java 不在其中。
-
我认为正则语言在这里有它的局限性。为此,请尝试查找上下文无关语法(如果 Java 支持)。
-
是这样吗?我的(错误)印象是,如果可以构造 CFG,那么也可以创建可实现的正则表达式。
-
您的主要问题是括号/表达式的无限嵌套:Java 中的正则表达式不适合递归,因此您的问题没有答案。你需要一个解析器。
-
如果您放弃搜索正则表达式解决方案,请开始阅读this question 的答案。我想你会发现一些有用的东西。例如 Javascript 引擎的求值器。如果它抛出
ScriptException,则表达式无效。
标签: java regex validation math expression