Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

forDevLife

[정규식] 문자열 계산기 본문

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의 메서드를 실행한다.

'Java' 카테고리의 다른 글

[Java] Call back(Listener)  (0) 2021.11.18
[Java] Recursive Type Bound  (0) 2021.11.14
[java] import, static import 문  (0) 2021.06.09
[java] hashCode(), toString(), equals()  (0) 2021.06.02
[java] 익명 클래스(anonymous class)  (0) 2021.05.28
Comments