개발일기/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) 이해하기 : 패턴, 문자 클래스, 자주 사용 패턴
[Java] 복습 - 정규식을 이용하여 문자열 치환하기 ( Matcher#replaceFirst, replaceAll, appendReplacement )