개발지식 먹는 하마 님의 블로그

Java - Pattern & Matcher 본문

Java

Java - Pattern & Matcher

devhippo 2025. 2. 28. 11:08

Pattern과 Matcher는 Java의 정규 표현식(Regax)을 처리하는 클래스이다.

이를 사용하면 문자열을 좀 더 자유자재로 다룰 수 있다.

Pattern 

  • 정규 표현식을 컴파일하여 Matcher 객체를 생성한다.
  • 한 번 생성되면 변경할 수 없다.
compile(String regex) 정규식을 컴파일하여 Pattern 객체를 생성한다.
compile(String regex, int flags) 특정 플래그와 함께 컴파일한다.
matches(String regex, CharSequence input) 문자열이 정규식과 완전히 일치하는지 확인한다.
split(CharSequence input) 문자열을 분리하여 배열로 반환한다.

 

Matcher

  • Pattern 객체를 사용해 문자열과 패턴을 비교한다.
matches() 전체적으로 패턴과 일치하는지 확인
find() 입력 문자열의 일부라도 패턴과 일치하는 부분을 찾는다.
group() find()로 찾은 문자열을 반환

start(), end(), replace 등의 메서드도 있다.

matches와 String의 equals는 전혀 다른 기능임을 유의하자!


정규 표현식

문자열 Split에서도 사용이 가능하다.

표현식 의미
[a-z] 알파벳 소문자
[A-z] 알파벳 대문자
[0-9] 숫자 0~9
[aeiou] 모음 aeiou 중 하나
[^a-z] 소문자가 아닌 모든 문자
. 줄바꿈 제외, 임의의 문자
\d 숫자
\D 숫자가 아닌 문자
\s 공백 문자
\S 공백이 아닌 문자

 

- 수량자 -

표현식 의미
a+ a가 1번 이상 반복
a* a가 0번 이상 반복
a? a가 0번 또는 1번 등장
a[n, n1] a가 n~n1번 반복 

 

- 앵커 - 

^a : a로 시작하는 문자열
a$ : a로 끝나는 문자열


예시

연산을 입력 받아서 숫자와 문자로 나누고 싶을 때,

숫자와 사칙연산 기호에 대하여 문자열을 나눌 수 있도록 컴파일한다.
\\d+ : 한 자리 이상의 숫자
[+\\-*/] : \\를 사용해 특수기호임을 나타낸다. []안에 들어가는 문장에는 \\가 임의로 이미 적용되기 때문에 + 뒤에 \\를 사용했다. 그러나 생략해도 무방하다.

 Pattern pattern = Pattern.compile("\\d+|[+\\-*/]");  // 숫자 또는 연산자 추출

패턴과 문자열이 일치하는지를 확인한다.

 Matcher matcher = pattern.matcher(input);

하나씩 매칭되는 값을 찾고 이를 가져온다.

while (matcher.find()) {
    tokens.add(matcher.group());  // 찾은 숫자 또는 연산자 추가
}

 

-전체 예시-

public class RegexMatcherExample {
    public static void main(String[] args) {
        String input = "12+34-56*78/90";  // 입력 문자열
        Pattern pattern = Pattern.compile("\\d+|[+\\-*/]");  // 숫자 또는 연산자 추출
        Matcher matcher = pattern.matcher(input);

        ArrayList<String> tokens = new ArrayList<>();

        while (matcher.find()) {
            tokens.add(matcher.group());  // 찾은 숫자 또는 연산자 추가
        }

        System.out.println(tokens);
    }
}

'Java' 카테고리의 다른 글

Spring Framework 1편  (4) 2025.08.08
Java - Enum  (0) 2025.03.11
Java - GUI JFrame  (0) 2025.02.25
Java - 람다(Lambda) & 스트림(Stream)  (0) 2025.02.25
Java - 제네릭 (Generic)  (0) 2025.02.25