[Java] 정규 표현식(regular expression)과 Pattern/Matcher 클래스
by 우와한개발자
[ 정규 표현식 ]
1. 정규 표현식(regular expression)
- 특정한 규칙을 가진 문자열을 표현하는데 사용되는 형식 언어
- 패턴(pattern) 또는 정규식 이라고 함.
- 문자열의 검색, 치환, 유효성 검사 등에 활용
1) 정규표현식 횟수 지정 메타문자 : 메타문자 앞의 문자가 몇번 반복될 수 있는지
| 메타문자 | 기능 | 설명 | 예시 |
| ? | 0회 또는 1회 | 바로 앞 문자가 있어도 되고 없어도 됨 | "colou?r" → "color", "colour" |
| * | 0회 이상 | 앞 문자가 0번 이상 반복 | "ab*c" → "ac", "abc", "abbc" |
| + | 1회 이상 | 앞 문자가 최소 1번 이상 반복 | "ab+c" → "abc", "abbc" |
| {n} | n회 | 앞 문자가 정확히 n번 반복 | "a{3}" → "aaa" |
| {m,} | m회 이상 | 앞 문자가 m번 이상 반복 | "a{2,}" → "aa", "aaa", "aaaa" |
| {m,n} | m~n회 | 앞 문자가 m번 이상 n번 이하 반복 | "a{1,3}b" → "ab", "aab", "aaab" |
2) 정규표현식 메타문자
| 메타문자 | 기능 | 설명 | 예시 |
| . | 문자 | 임의의 문자 한 개와 일치 (줄바꿈 제외) | a.c → abc, a1c |
| [ ] | 문자들 | 대괄호 안 문자 중 하나와 일치 | [abc]d → ad, bd, cd |
| [^ ] | 부정 | 대괄호 안 문자를 제외한 문자와 일치 | [^abc]d → ed, fd |
| ^ | 시작 | 문자열 또는 행의 시작 | ^abc → abcdef |
| $ | 끝 | 문자열 또는 행의 끝 | abc$ → 123abc |
| ( ) | 그룹 묶기 | 여러 식을 하나로 묶음 | (ab)+ → ab, abab |
| \n | n번째 패턴 | n번째 캡처 그룹 참조 | (ab)\1 → abab |
| \w | 영숫자 | [a-zA-Z0-9_]와 동일 | \w+ → abc123 |
| \W | 영숫자 제외 | 영문자/숫자/밑줄 제외 문자 | \W → @ |
| \s | 공백 | 공백 문자 (space, tab 등) | a\sb → a b |
| \S | 공백 제외 | 공백이 아닌 문자 | \S+ → abc |
| \d | 숫자 | [0-9]과 동일 | \d+ → 123 |
| \D | 숫자 제외 | 숫자가 아닌 문자 | \D → a |
| 메타문자 | 기능 | 설명 | 예시 |
| ` | ` | OR | 왼쪽 또는 오른쪽 패턴과 일치 |
| \. | 문자 . | 점 자체 문자 | a\.b → a.b |
| \* \+ \? | 문자 | 메타문자를 문자로 사용 | a\+b |
| (?: ) | 비캡처 그룹 | 그룹 묶기지만 캡처하지 않음 | (?:ab)+ |
| (?= ) | 긍정 전방탐색 | 뒤에 패턴이 있어야 함 | foo(?=bar) |
| (?! ) | 부정 전방탐색 | 뒤에 패턴이 오면 안됨 | ^(?!ab) |
| (?<= ) | 긍정 후방탐색 | 앞에 패턴이 있어야 함 | (?<=\$)\d+ |
| (?<! ) | 부정 후방탐색 | 앞에 패턴이 있으면 안됨 | (?<!\$)\d+ |
| \b | 단어 경계 | 단어의 시작 또는 끝 | \bcat\b |
| \B | 단어 경계 아님 | 단어 내부 위치 | \Bcat\B |
| \A | 문자열 시작 | 멀티라인 영향 없는 시작 | \Aabc |
| \Z | 문자열 끝 | 개행 전 문자열 끝 | abc\Z |
| \z | 문자열 끝 | 절대 문자열 끝 | abc\z |
[ Pattern 과 Matcher ]
1. Pattern 클래스
- Pattern 클래스는 정규식 문자열을 컴파일해서 재사용 가능한 패턴 객체로 만드는 클래스
Pattern p = Pattern.compile("\\\\d{3}-\\\\d{3,4}-\\\\d{4}");
| 메서드 | 반환 타입 | 설명 |
| compile(String regex) | Pattern | 정규표현식 패턴 객체 생성 |
| compile(String regex, int flags) | Pattern | 옵션(flags)을 포함하여 패턴 생성 |
| matcher(CharSequence input) | Matcher | 입력 문자열에 대해 Matcher 객체 생성 |
| matches(String regex, CharSequence input) | boolean | 문자열 전체가 패턴과 일치하는지 확인 |
| pattern() | String | 컴파일된 정규표현식 문자열 반환 |
| split(CharSequence input) | String[] | 정규식 기준으로 문자열 분리 |
| split(CharSequence input, int limit) | String[] | 분리 개수 제한하여 문자열 분리 |
2. Matcher클래스
- 컴파일된 Pattern을 실제 문자열에 적용해서 매칭 여부를 확인하거나 일치하는 부분을 추출하는 클래스
Pattern p = Pattern.compile("\\\\d{3}-\\\\d{3,4}-\\\\d{4}");
Matcher m = p.matcher("010-1234-5678");
if (m.matches()) {
System.out.println("올바른 전화번호 형식");
}
// 문자열에서 패턴 반복 탐색
String text = "연락처: 010-1234-5678, 팩스: 02-123-4567";
Matcher m2 = p.matcher(text);
while (m2.find()) {
System.out.println("발견: " + m2.group());
System.out.println("위치: " + m2.start() + " ~ " + m2.end());
}
| 메서드 | 반환타입 | 설명 |
| matches() | boolean | 문자열 전체가 패턴과 일치하는지 확인 |
| find() | boolean | 패턴과 일치하는 부분이 있는지 탐색 (반복 호출 가능) |
| group() | String | find() 또는 matches() 이후 일치한 문자열 반환 |
| start() | int | 일치한 부분의 시작 인덱스 반환 |
| end() | int | 일치한 부분의 끝 인덱스 반환 |
⚠️ matches() vs find() 차이
메서드 동작방식 사용 상황 matches() 문자열 전체가 패턴과 일치해야 true 입력값 유효성 검증 find() 문자열 일부라도 일치하면 true 텍스트에서패턴 검색
'언어 > Java' 카테고리의 다른 글
| [Java] 날짜 클래스(Date, Calendar)와 지역과 시간대 클래스(Locale, Timezone) (0) | 2026.03.05 |
|---|---|
| [Java] Object 클래스(equals / hashCode / toString / 스레드) (0) | 2026.03.05 |
| [Java] 문자열 클래스(String, StringBuffer, StringBuilder) (0) | 2026.03.04 |
| [Java] 파일 입출력 - 입출력 스트림과 직렬화(Serialization) (0) | 2026.03.04 |
| [Java] record 클래스와 Lombok 라이브러리 (1) | 2026.03.04 |
블로그의 정보
우와한개발자 님의 블로그
우와한개발자