我想知道一个字符串是否是一个数学表达式。
我的问题的真正本质是在任何给定的字符串中查找与以下任何一个都不匹配的符号:*,/,+,-,(,),0-9。

if (Pattern.compile("[a-z]").matcher(inputExpression).find()) {
        return ErrorType.ALPHABETIC_SYMBOL;
    } else if (!inputExpression.matches("[-+*/()]") || !inputExpression.matches("[0-9]")) {
        return ErrorType.UNKNOWN_SYMBOL;
    }


我究竟做错了什么?如果我删除第二个if语句并希望在我的字符串中找到字母符号,该程序将起作用。

我尝试执行以下操作:将matchs方法更改为.find()以查找模式是否存在,如下所示。

if (Pattern.compile("[a-z]").matcher(inputEquation).find()) {
        return ErrorType.ALPHABETIC_SYMBOL;
    } else if (!Pattern.compile("[-*+/]").matcher(inputEquation).find() && !Pattern.compile("[0-9]").matcher(inputEquation).find()) {
        return ErrorType.UNKNOWN_SYMBOL;
    }


该代码仍无法正常工作。我有逻辑错误。

最佳答案

您的问题出在inputExpression.matches上。它不搜索字符串,而是检查整个字符串是否匹配。您需要的是



if (Pattern.compile("[A-Za-z]").matcher(inputExpression).find()) {
    return ErrorType.ALPHABETIC_SYMBOL;
} else if (Pattern.compile("[^-+*/()0-9]").matcher(inputExpression).find()) {
    // [^...] negates a character class
    return ErrorType.UNKNOWN_SYMBOL;
}


老实说,您甚至不需要正则表达式。以下循环可以达到相同的结果,并且更易于查看。

String accepted = "-+*/()";
for (int i = 0; i < inputExpression.length(); i++) {
    char c = inputExpression.charAt(i);
    if (c >= '0' && c <= '9') continue;
    if (c >= 'a' && c <= 'z') return ErrorType.ALPHABETIC_SYMBOL;
    if (c >= 'A' && c <= 'Z') return ErrorType.ALPHABETIC_SYMBOL;
    if (accepted.indexOf(c) < 0) return ErrorType.UNKNOWN_SYMBOL;
}

10-08 02:22