Java

[정규식] 문자열 계산기

JH_Lucid 2021. 9. 30. 17:00
주요 부분

 

< 정규 표현식 >

private static final String OPERATION_REGULAR = "^[+\\-*/\\d]*$";
    //    private static final String OPERATION_REGULAR = "^[+\\-*/[0-9]]*$";
private static final String OPER_REGULAR = "[+\\-*/]";
private static final String NUMBER_REGULAR = "^[0-9]*$";
public static final Pattern validOperationPattern = Pattern.compile(OPERATION_REGULAR);
  • Operation_regular 하나로 사칙 연산자(+, -, /, *) 및 숫자[0~9] (== \\d)를 검증할 수 있다.
  • Pattern.compile을 통해 규칙을 등록해놓으면, validOperationPattern을 통해 검증할 수 있다.

 

< 정규 표현식 검증 메서드 >

boolean validateBlank() {
        boolean b = false;
        for (String s : splitedValues) {
            Matcher matcher = Validator.validOperationPattern.matcher(s);
            b = matcher.find();
            if (!b) break;
        }
        return b;
}
  • 앞서 정의한 메서드이름.matcher(String s)를 통해 Matcher를 반환받을 수 있다.
  • Matcher.find를 통해 전달된 String이 규칙에 맞는 내용인지 검증한다. 아니라면 false를 반환한다.
  • 조건을 통해 false라면 식 전체가 쓸모 없어지므로 break를 걸어 false를 반환한다.

 

< Enum 타입을 이용한 Operation 작성 >

public class Operation {

    enum Operator {

        PLUS("+", (n1, n2) -> n1 + n2),
        MINUS("-", (n1, n2) -> n1 - n2),
        MULT("*", (n1, n2) -> n1 * n2),
        DIVIDE("/", (n1, n2) -> n1 / n2);

        private String operator;
        private BiFunction<Double, Double, Double> expression;

        Operator(String operator, BiFunction<Double, Double, Double> expression) {
            this.operator = operator;
            this.expression = expression;
        }

        public double calculate(double num1, double num2) {
            return this.expression.apply(num1, num2);
        }
    }

    private Map<String, Operator> operators = new HashMap<>();

    public Operation() {
        for (Operator value : Operator.values()) {
            operators.put(value.operator, value);
        }
    }

    public double run(String operator, double num1, double num2) {
        return operators.get(operator).calculate(num1, num2);
    }
}
  • enum 타입으로 연산자 및 그에 해당하는 BiFunction을 만들었다.
  • enum의 메서드로 BiFunction을 실행하는 calculate를 정의한다.
  • 위의 타입을 클래스 생성 시 Map에 저장하는 생성자를 생성한다.
  • 클래스의 run 메서드를 통해 operator와 일치하는 enum을 찾아, enum의 메서드를 실행한다.