gpt4 book ai didi

java - 控制字符串是否为数学表达式

转载 作者:行者123 更新时间:2023-11-30 06:12:40 25 4
gpt4 key购买 nike

我正在寻找一种方法来检查字符串是否是数学表达式,例如

x + y -sin(1) * 99k

我不想评估表达式,但要了解字符串是否以正确的方式编写。

有一些 Java 库可以做到这一点吗?

更新:对不起,这不是一个方程式,而只是一个表达式(没有'=')。我想到了一个可能的解决方案:

  1. 指定使用的变量
  2. 用'1'替换所有变量
  3. 用 JEval 评估新的字符串
  4. 如果程序抛出一个Exception,表达式是错误的

你怎么看?

谢谢

最佳答案

尝试 ANTLR .您可以编写如下语法:

grammar Expr;       

expr: FuncitonName '(' expr ')'
| '-' expr
| '(' expr ')'
| expr '*' expr
| expr '+' expr
| expr '-' expr
| expr '/' expr
| Const
| Variable
;

FuncitonName : [a-z] + ;
Variable : [a-zA-Z] + ;
Const : [0-9] +;

WS : [ \t\r\n\u000C]+ -> skip;

您应该根据允许的表达式和不允许的表达式来更正确地定义语法。将其保存在文件 Expr.g4 中并执行 antlr4 Expr.g4 以获取您的 ExprLexer.javaExprParser.java文件。然后你可以用它们来检查一个句子是否是一个算术表达式:

import org.antlr.v4.runtime.ANTLRInputStream;
import org.antlr.v4.runtime.BailErrorStrategy;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.misc.ParseCancellationException;

public static boolean isExpr(String exp) {

ExprLexer lexer = new ExprLexer(new ANTLRInputStream(exp));
CommonTokenStream tokens = new CommonTokenStream(lexer);
ExprParser parser = new ExprParser(tokens);

parser.removeErrorListeners();
parser.setErrorHandler(new BailErrorStrategy());

try {
parser.expr();
return true;
} catch (ParseCancellationException e) {
return false;
}

}

最后测试:

System.out.println(isExpr("x + y -sin(1) * 99 * k")); //true
System.out.println(isExpr("x + y +")); //false

可以引用this问题。

关于java - 控制字符串是否为数学表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32603878/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com