[Java] 자바 정규표현식

오늘 코딩테스트 연습을 하다가 입력된 값에서 원하는 값만 추출하는 기능을 사용해야 할 일이 있었다.

나는 replaceAll() 메서드를 사용했고 replaceAll()메서드를 사용하기 위해선 정규표현식에 대해 이해를 했어야했기에 오늘 정규표현식에 대해 알아보도록 했다.

자주 사용하는 정규표현식

먼저 자주 사용하는 정규표현식이다.

^[0-9]*$ 숫자
^[a-zA-Z]*$ 영문자
^[가-힣]*$ 한글
\w+@\w+\.\w+(\.\w+)? E-Mail
^\d{2,3}-\d{3,4}-\d{4}$ 전화번호
^01(?:0|1|[6-9])-(?:\d{3}|\d{4})-\d{4}$ 휴대전화번호
\d{6} - [1-4]\d{6} 주민등록번호
^\d{3}-\d{2}$ 우편번호

위 정규표현식 표만 봐서는 어떤식으로 어떻게 적용해야할지 감이 잘 안잡힐 것이다.

위와 같은 정규표현식을 Pattern 클래스의 메서드나 Matcher 클래스의 메서드 등과 같은 곳에 적용시켜야 하는데 적용시키기 위해서는 문법도 이해 필요가 있다.



정규표현식 문법
정규 표현식 설명
^ 문자열 시작
$ 문자열 종료
. 임의의 한 문자(단 \은 넣을 수 없음)
* 앞 문자가 없을 수도 무한정 많을 수도 있음
+ 앞 문자가 하나 이상
? 앞 문자가 없거나 하나 있음
[ ] 문자의 집합이나 범위를 나타내며 두 문자 사이는 - 기호로 범위를 나타냅니다. [] 내에서 ^ 가 선행하여 존재하면 not을 나타낸다.
{ } 횟수 또는 범위를 나타냅니다.
( ) 소괄호 안의 문자를 하나의 문자로 인식
| 패턴 안에서 or 연산을 수행할 때 사용
\ 정규 표현식 역슬래시()는 확장문자 (역슬래시 다음에 일반 문자가 오면 특수문자로 취급하고 역슬래시 다음에 특수문자가 오면 그 문자 자체를 의미)
\b 단어의 경계
\B 단어가 아닌것에 대한 경계
\A 입력의 시작 부분
\G 이전 매치의 끝
\Z 입력의 끝이지만 종결자가 있는 경우
\z 입력의 끝
\s 공백 문자
\S 공백 문자가 아닌 나머지 문자
\w 알파벳이나 숫자
\W 알파벳이나 숫자를 제외한 문자
\d 숫자 [0-9]와 동일
\D 숫자를 제외한 모든 문자
(?i) 앞 부분에 (?!)라는 옵션을 넣어주게 되면 대소문자는 구분하지 않습니다.

위와 같이 기능에 따라 정규표현식의 문법도 여러 가지 있는 것을 볼 수 있다.

그렇다면 실제 내가 풀었던 문제를 예시로 replaceAll()메서드에 적용시키는 것을 보도록 하자.



String answer = new_id.toLowerCase();

answer = answer.replaceAll("[^-_.a-z0-9]","");

먼저 answer를 String값으로 선언해준 후 new_id라는 문자열의 소문자로 변환한 형태로 만들어주었다.

그 이후에 answer를 replaceAll()메서드를 사용해 정규표현식을 통해 정의해줬는데

answer.replaceAll(“[^-.a-z0-9]”,””); 부분을 해석해보면 []내에서 ^가 먼저 시작했으므로 아닐경우라는 의미를 가지고있다. 그 이후에 정규표현식은 -.와 a-z(소문자 알파벳), 0-9(숫자)를 포함하지 않으면 ““로 replace 해주라는 것을 뜻한다. 즉 선언해준 문자열을 제외한 모든 문자열은 지운다는 것이다.



answer = answer.replaceAll("[.]{2,}", ".");

그 다음 정규표현식을 보자. 마잔가지로 answer에 replaceAll()메서드를 사용해주었는데 [.]{2,}을 먼저 보면 .이라는 문자열이 2개 있을 때를 말한다. 근데 {2}라고 할 수 있는데 {2,}는 무엇을 의미할까?

{n}은 정확히 n개를 뜻하고 {n,}은 최소한 n개를 뜻한다.

본인은 연속된 .을 대상으로 했기에 {2,}를 써주었다.

그리고 마지막으로 ,뒤에 “.”을 통해 연속된 .들을 하나의 .으로 바꿔주도록 한 것이다.

answer = answer.replaceAll("^[.]|[.]$", "");

마지막 예시이다. 이번에는 아까와 다르게 []안에 ^가 들어있지 않고 처음부터 ^가 들어있다.

이것은 문자열의 시작을 의미한다. 그리고 [.]$의 $는 문자열의 종료를 의미한다.

즉 문자열의 시작과 끝에 .이 있으면 지우도록 하는 코드이다.



이처럼 정규표현식에 대해 간단하게 알아보았다.

미리 기억해놨다가 원할때 사용하면 정말 좋을 것 같다.

Categories:

Updated: