앞선 포스트에서 Java에서 정규표현식과 replaceAll() 메서드를 이용해 특정 패턴의 문자열을 치환하는 방법에 대해 알아보았다.
이번에는 이를 이용해, 2021 카카오 블라인드 기출문제인 '신규아이디 추천'을 풀어보려고 한다.
문제는 다음과 같다.
1단계의 경우, 별다른 정규표현식의 사용 없이 String의 메서드인 toLowerCase()
를 사용한다.
2단계는 위와 같이 regex를 지정할 수 있다. [] 내의 문자들 중 어떠한 것들도 포함될 수 있으므로 해당 문자들 모두가 빈칸으로 치환된다.
또는, 메타문자 ^
를 사용해 알파벳 소문자, 숫자, -, _, . 를 제외시켜줄수도 있다.
answer = answer.replaceAll("[^a-z0-9-_.]",""); //위와 같은 의미
두가지 중, 어느방법을 써도 같은 의미이나, 아래의 ^를 사용한 방법이 가독성 측면에서도, 실수를 방지하기 위해서도 좋은듯 하다.
이 경우, n번 이상 반복에 해당되는 {n}
정규표현식을 사용해도 되며, 위와 같이 메타문자 +
를 이용해 1번이상 반복되는 마침표에 대해 치환할 수도 있다.
주의할 점은, 한 문자를 표현하는 []의 사용 없이, 특정 문자를 바로 표현할 경우 메타문자와 겹칠 수 있다.
이 경우 \\
(역슬래쉬 두번)을 앞에 붙여, 해당 문자열 그대로라는 의미를 전해야한다.
위의 경우 .
는 메타문자와 중복되므로 \\.
으로 표현해주어야한다.
또는, 간단히 [.]+
로 표현해도 무방하다.
이 경우, 문자열의 시작을 의미하는 메타문자 ^, 문자열의 끝을 의미하는 메타문자$ 를 이용해 regex를 규정할 수 있다.
^[.]
: 문자열의 시작에 오는 마침표,
[.]$
: 문자열의 끝에 오는 마침표 를 의미하므로
^[.] | [.]$
: 문자열의 시작 또는 끝에 오는 마침표를 의미한다.
5단계는 간단히 공백문자여부 확인 후 문자열을 a로 지정한다.
6단계는 두 단계로 나뉘는데, 첫 단계는 String클래스의 substring()
메서드를, 두번째 단계는 정규식을 사용할 수 있다.
string.substring(m,n)
: 문자열 string에 대해, string[m] 부터 string[n-1]번째 범위를 잘라 반환한다.
이때 첫 15개의 문자라고 했으므로, 0번 ~ 14번 문자를 떼어내야한다.
substring(0,14) 가 아닌, substring(0,15)임에 주의하자.
두 번째 단계의 경우, 앞선 4단계와 유사하게 $
문자를 사용해 처리할 수 있다.
7단계의 경우, 정규식의 사용 없이 반복문을 이용해 표현할 수 있다.
'신규 아이디 추천' 문제의 경우 정규표현식과 String 클래스의 메서드인 substring
, toLowerCase
등을 알고 있는지 확인해볼 수 있는 문제였다.
문제는여기를 클릭해 확인할 수 있으며, 다음 포스트에서는 regex 패키지에 대해 알아보자.