개발일기/Java

[Java] 정규 표현식 정리

Yoon Yusang 2025. 5. 3. 00:21

문자열 처리를 하는 데 빠질 수 없는 것이 정규 표현식이다.

오랫동안 '나중에 제대로 공부해야지' 하면서 넘어가다가 이 사단이 났는데, 이번에야말로 제대로 공부해놓으려고 한다.

라고 시작했는데 뭔가 어렵네요.

쓸 일 있을 때마다 다시 공부해야할듯.

 

 

정규 표현식 기본 문법

 

문자 클래스

패턴 설명
\\w 알파벳 대소문자 + 숫자 + "_" ^\\w{3}$
-> 대상 문자 3글자의 조합
\\d 숫자 ^\\d{3}- \\d{4}$
-> 우편번호 포맷
\\s 공백문자(스페이스, 탭, 개행) ^ \\s+$
-> 공백문자가 1개 이상 있음

- 패턴의 문자를 대문자로 바꾸면 NOT의 의미가 된다. ex) \\D : 숫자가 아닌 문자

 

 

어설션

패턴 설명
^ 문장의 시작 ^www
-> "www"로 시작하는 문자열
$ 문장의 끝 com$
-> "com"으로 끝나는 문자열

 

 

수량자

패턴 설명
? 없거나, 1개 있거나 ^ \\d{3}-?\\d{4}-?\\d{4}$
-> 전화번호("-"가 있거나 없거나)
* 없거나, 여러 개 있거나 ^a1*$
-> a, a1, a11, a111, ...
+ 1개 이상 있음 ^a1+$
-> a1, a11, a111, ...
{n} 정확히 n개 있음 ^퉁{9}사후르$
-> 퉁퉁퉁퉁퉁퉁퉁퉁퉁사후르
{min, max} min개 이상 max개 이하 있음 ^퉁{2,10}사후르$
-> 퉁퉁사후르, 퉁퉁퉁사후르, ..., 퉁퉁퉁퉁퉁퉁퉁퉁퉁퉁사후르
{min,} min개 이상 있음 ^퉁{1,}사후르$
-> 퉁사후르, 퉁퉁사후르, 퉁퉁퉁사후르, ...
{,max} max개 이하 있음 ^퉁{,5}사후르$
-> 퉁퉁퉁퉁퉁사후르, 퉁퉁퉁퉁사후르, 퉁퉁퉁사후르, ...

 

 

그룹과 범위

패턴 설명
() 그루핑 (tom❘pot)ato
-> "tomato", "potato"
[] 문자세트([] 안의 문자들을 OR의 요소로 봄) [abc]ddd
-> "addd", "bddd", "cddd"
[^] 문자세트 부정 [^abc]
-> "a", "b", "c"를 제외한 문자

 

 

자주 쓰이는 정규 표현식

^[\\w]+$ 문자 1개 이상으로 이루어진 문자열
^[a-zA-Z]+$ 영문으로만 이루어진 문자열
^[0-9a-zA-Z]+$ 영문과 숫자로만 이루어진 문자열
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$ 이메일 형식
^\\d{2,3}-?\\d{4} -?\\d{4}$ 전화번호

 

 

정규 표현식 메소드

 

Pattern 클래스

// String형의 정규식을 Pattern객체로 반환
Pattern pt = Pattern.compile(":+");

String str1 = "::";
String str2 = "hello:world";

// 문자열이 정규식에 만족하는지 검사 -> true출력
System.out.println(Pattern.matches(":+", str1));

// Matcher객체로 반환
Matcher m = pt.matcher(str1);

// 정규식을 문자열로 반환
System.out.println(pt.pattern());

// 문자열을 정규식 기준으로 나누어 String배열로 반환 -> hello world출력
System.out.println(pt.split(str2)[0] + " " + pt.split(str2)[1]);
Pattern.matches(String regex, CharSequence input) 대상 문자열과 정규식이 일치하면 true, 불일치하면 false
Pattern.matcher(CharSequence input) 문자열에서 정규식에 대해 매칭되는 부분을 Matcher객체로 반환한다.
Pattern.compile(String regex) 정규식을 컴파일해 Pattern객체로 반환한다.
Pattern.compile(String regex、int flags) 정규식을 지정된 flag옵션으로 컴파일해 Pattern객체로 반환한다.
Pattern.pattern() 컴파일된 정규식을 String으로 반환한다.
Pattern.split(CharSequence input) 정규식을 기준으로 문자열을 나누어 String배열로 반환한다.

 

 

Matcher 클래스

Pattern pt = Pattern.compile(":+");
String str1 = "dd::dd:::ddd:";
Matcher mc = pt.matcher(str1);

// 정규식에 만족하는 문자열그룹을 발견할 때마다
while(mc.find()) {
    // 문자열그룹을 출력 -> ::, :::, :가 순차적으로 출력
    System.out.println(mc.group());
}
// 문자열이 정규식에 만족하는지 검사 -> false 출력
System.out.println(mc.matches());

// 마지막 탐색지점으로부터 탐색 -> false 출력
System.out.println(mc.find());
// 3번 인덱스부터 탐색 -> true
System.out.println(mc.find(3));

// 3번 인덱스부터 탐색 후 문자열로 출력 -> 3번 인덱스에 :발견해 출력
System.out.println(mc.find(3));
System.out.println(mc.group());

// 0번 인덱스부터 탐색 -> 인덱스 2~3에 해당하는 :: 발견
System.out.println(mc.find(0));
// start는 2, end는 4
System.out.println(mc.start());
System.out.println(mc.end());

// 4번 인덱스부터 탐색 -> 인덱스 6~8에 해당하는 ::: 발견
System.out.println(mc.find(4));
// start는 6, end는 9
System.out.println(mc.start());
System.out.println(mc.end());
Matcher.matches() 문자열이 정규식에 만족하면 true, 아니면 false 반환
Matcher.find() 마지막 탐색 지점부터 탐색 시작. 정규식에 만족하는 문자열이 있으면 true, 없으면 false 반환
Matcher.find(int start) start 인덱스부터 탐색 시작. 정규식에 만족하는 문자열이 있으면 true, 없으면 false 반환
Matcher.start() 탐색해 발견한 문자열의 시작 인덱스 반환
Matcher.end() 탐색해 발견한 문자열의 끝 인덱스+1 반환
Matcher.group() 탐색해 발견한 문자열 반환
Matcher.reset() 탐색 위치를 초기
Matcher.replaceFirst(String str) 탐색해 처음 발견한 문자열을 교체
Matcher.replaceAll(String str) 탐색해 발견한 모든 문자열을 교체
Matcher.appendReplacement(
StringBuffer sb,String str)
발견한 문자열을 교체한 뒤 결과를 버퍼에 저장
Matcher.appendTail(StringBuffer sb) 탐색이 끝난 위치부터 남아있는 문자열을 버퍼에 결합

 

- 참고 자료 -

[Java] 정규표현식(RegExp) 이해하기 : 패턴, 문자 클래스, 자주 사용 패턴

Pattern, 어렵지 않게 사용하기

Matcher, 어렵지 않게 사용하기

[Java] 복습 - 정규식을 이용하여 문자열 치환하기 ( Matcher#replaceFirst, replaceAll, appendReplacement )