在字符串验证中查找失败的地方

时间:2018-10-02 09:51:01

标签: java regex validation exception

只是试图找出实现此目的的最佳方法。

我的输入字符串通过了几种验证方法:

public class Validator {

    private static final String VALID_INFIX_REGEX = "^[0-9(]([\\s0-9+*/()-])*[0-9)]$";

    public boolean validate(String input) {
        return (isValidInfixExpression(input) && hasBalancedParenthesis(input) && checkIfOperatorsAppearConsecutively(input));
    }

    private boolean isValidInfixExpression(String input) {

        final Pattern pattern = Pattern.compile(VALID_INFIX_REGEX);
        final Matcher matcher = pattern.matcher(input);

        return matcher.matches();
    }

    private boolean hasBalancedParenthesis(String input) {

        String[] tokens = input.split("\\s");

        int unclosedParenthesis = 0;
        for (int i = 0; i < tokens.length; i++) {

            if ("(".equals(tokens[i])) {
                unclosedParenthesis++;
            } else if (")".equals(tokens[i])) {
                unclosedParenthesis--;
            }
        }
        return (unclosedParenthesis == 0);
    }

    private boolean checkIfOperatorsAppearConsecutively(String input) {

        String[] tokens = input.split("\\s");

        for (int i = 0; i < tokens.length; i++) {
            if (Operator.isOperator(tokens[i])) {

                if ("(".equals(tokens[i - 1]) || ")".equals(tokens[i + 1]) || Operator.isOperator(tokens[i + 1])) {
                    return false;
                }
            }
        }
        return true;
    }
}

对于一个用户,我希望能够抓住String在验证中失败的位置并显示给他们。

在将我的String传递给验证的地方,如果失败,则会抛出异常:

if (validator.validate(input)) {
    // execute
} else {
    throw new IllegalArgumentException();
}

我是否最好在实际的验证方法中抛出异常以执行此操作?还是有更好的方法?

1 个答案:

答案 0 :(得分:2)

要知道验证在哪里失败,您将需要返回某种形式的对象,并返回失败的结果。

我建议创建一个新的例外来做到这一点:

public class InvalidInputException extends IllegalArgumentException {

    private int errorIndex;

    public InvalidInputException(String message) {
        super(message);
    }

    public InvalidInputException(String message, int index) { 
         super("Invalid Input at index: " + index + " " + message);
         errorIndex = index;
    }

    public int getErrorIndex() { return errorIndex; }
}

然后,您可以调整验证方法以检测验证失败的地方,并将其包括在异常中。例如

throw new InvalidInputException("Missing closing parenthesis", 200);

throw new InvalidInputException("Invalid format");