FireDrago
[좌표 계산기] 정규표현식의 강력함 본문
정규표현식 - 유효성 검사
정규표현식을 사용하면 유효성 검사가 편리해진다.
좌표계산기 미션의 요구사항 중에서 입력에 관한 요구사항을 살펴보자
1. 괄호로 둘러쌓인 (x , y) 좌표
2. 좌표값은 두개 입력가능 ( 다음 미션에서 네개까지 입력가능)
3. 두개 입력한 경우 "-" 구분자로 좌표구분 ex) (x1,y1)-(x2,y2)
4. 입력값은 24이하
입력이 있는곳에 유효성 검사가 있다. 위의 입력 요구사항에 어긋나면, 예외를 발생시키고 다시 입력을 받고싶다.
이때 유효성 검사를 어떻게 해야할까? 사용자가 입력할 수 있는 경우의 수를 살펴보자
1. (2,23) // (333,02)-(123,4) // (32,1)- ... (2,1) 한 개 또는 다수의 좌표
2. null 혹은 "" 빈 문자열
3. 그외 모든 입력
정규표현식은 위 1의 조건을 하나의 식으로 표현 할 수 있다. 단 한줄의 식으로 다양한 입력 경우의 수를 포괄할 수 있다.
private void isCorrectInput(String input) throws IllegalArgumentException
//자바에서는 문자열 안에 표현식을 쓸때 \\(이스케이프 문자) 를 두번 써준다.
Pattern pattern = Pattern.compile("(\\([0-9]{1,2},[0-9]{1,2}\\))(\\(-[0-9]{1,2},[0-9]{1,2}\\))*");
Matcher matcher = pattern.matcher(input);
if(!matcher.matches()) {
throw new IllegalArgumentException(WRONG_PATTERN);
이스케이프 문자를 통해 '(' ')' 가 입력값에 포함되도록 하고,
[0-9]{1,2} 를 통해 한자리 혹은 두자리의 숫자로 입력되는 좌표를 표현한다.
(- 좌표,좌표) * 를 통해 -(x,y) 패턴 자체가 여러번 반복될 수 있음을 표현한다. ( * 은 0번 혹은 여러번 반복을 의미)
입력값의 형식이 정규표현식과 부합 match( ) 하지 않으면 모두 잘못된 입력으로 예외처리한다. 만약 정규표현식을
사용하지 않았다면 사용자의 입력 경우의 수 각각마다 유효성 검사를 해줘야 한다.
주의할 점도 있다. 과연 위의 정규표현식이 사용자의 모든 잘못된 입력을 막아 줄 수 있을까? 정규표현식을 테스트 할 수 있는 사이트를 통해 확인해보자

두번째 좌표가 (2,ㅐ)로 잘못 입력 되어있음에도 정규식에 부합된다고 판정한다. 앞의 (2,3) 좌표는 정규식에 부합하고,
-(2,ㅐ) 는 부합하지 않아도 * 에 의해 0번 (두번째 좌표 없음)으로 처리되어 부합하는 것으로 처리된다. 이처럼 정규표현식은 반드시 입력상의 예외가 없는지 확인해야 한다. 입력 요구사항 중에서 25 이상의 값은 받지 않도록 해야하는데, 값에대한 예외처리는 도메인 영역에서 처리 해줘야 하는 경우도 있다.
정규표현식 - 값의 추출
정규표현식을 통해 형식에 부합하는 값을 쉽게 꺼낼 수 있다.
유효성 검사를 무사히 통과했다면 사용자가 입력한 값이 형식에 부합한다는 것을 의미한다. 이때 정규표현식은 값을 쉽게 꺼낼 수 있게 해준다.
private Point createPoint(String coordinate) throws IllegalArgumentException
Pattern pattern = Pattern.compile("\\(([0-9]{1,2}),([0-9]{1,2})\\)");
Matcher matcher = pattern.matcher(coordinate);
if (matcher.matches()) {
int xAxis = Integer.parseInt(matcher.group(1));
int yAxis = Integer.parseInt(matcher.group(2));
return new Point(xAxis,yAxis);
}
throw new IllegalArgumentException(WRONG_PATTERN);
정규표현식에서는 ( ) 를통해 그룹을 지정하고 group(index) 메서드를 통해 그룹에 해당하는 값을 쉽게 꺼내올 수 있다.
위 메서드에서는 유효성 검사에서 (2,3)-(2,ㅐ) 가 통과되는 경우를 막기위해 - 단위로 좌표를 쪼갠뒤 다시한번 유효성 검사를 한다.
<정규표현식의 강력한 장점>
1. 입력에 대한 유효성 검사를 편하게 해주고
2. 형식에 맞는 값을 쉽게 추출 할 수 있게 해준다.
정규표현식을 잘 다루는 방법은 뭘까? 정규표현식의 표현을 표로 정리해 보려고 했지만 그때 뿐이고 잊어버릴 것 같아서 하지 않았다. 그보다는 여러 가지 상황을 코딩을 통해 만나고 그때그때 상황에 맞는 정규표현식을 고민하면서 실력을 쌓는 방법이 더 빨리 정규표현식에 익숙해질 수 있는 방법이라고 생각한다. 좌표 계산기 미션을 통해 입력에 대한 유효성 검사를 고민하면서 정규표현식의 강력함과 필요성을 깨달았다면, 다음 도전부터는 정규표현식에 조금씩 익숙해질 수 있도록 해야겠다.
'자바 플레이그라운드' 카테고리의 다른 글
| 치지직 api (0) | 2025.12.29 |
|---|---|
| [좌표계산기] 사용자 입력에 관한 생각정리 (0) | 2023.10.12 |
| [java] null 유효성 검사는 제일 먼저 (0) | 2023.08.27 |
| 숫자야구게임 후기 (0) | 2023.07.29 |
