우와한 개발자

[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 텍스트에서패턴 검색

 

블로그의 정보

우와한개발자 님의 블로그

우와한개발자

활동하기