Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

예제로 배우는 Java Pattern 클래스의 compile() 메서드 완벽 가이드

java.util.regex 패키지의 Pattern 클래스는 정규 표현식(regular expression)이 컴파일된 형태를 나타내는 클래스입니다.
이 클래스가 제공하는 compile() 메서드는 정규 표현식을 담은 문자열을 인자로 전달받아, 이를 컴파일한 Pattern 객체를 반환합니다.

컴파일된 Pattern 객체는 matcher() 메서드를 통해 Matcher 객체를 생성하고, 이 Matcher를 이용해 입력 문자열과 정규 표현식의 매칭 여부를 검사할 수 있습니다.

compile() 메서드 기본 예제

다음 예제는 사용자로부터 문자열을 입력받아, 해당 문자열에 숫자가 포함되어 있는지 정규 표현식으로 확인합니다.

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class CompileExample {
    public static void main(String args[]) {
        // 입력 문자열 읽기
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter input string");
        String input = sc.nextLine();
        // 숫자를 찾기 위한 정규 표현식
        String regex = "(\\d)";
        // 정규 표현식 컴파일
        Pattern pattern = Pattern.compile(regex);
        // 컴파일된 정규 표현식 출력
        System.out.println("Compiled regular expression: " + pattern.toString());
        // Matcher 객체 가져오기
        Matcher matcher = pattern.matcher(input);
        // 매칭 결과 확인
        if (matcher.find()) {
            System.out.println("Given String contains digits");
        } else {
            System.out.println("Given String does not contain digits");
        }
    }
}

실행 결과

Enter input string
hello my id is 1120KKA
Compiled regular expression: (\d)
Given String contains digits

위 코드에서 (\d)는 숫자 한 자리를 의미하는 정규 표현식입니다. 입력 문자열에 숫자가 하나라도 포함되어 있으면 find() 메서드가 true를 반환하기 때문에, 문자열에 숫자가 존재하는지 손쉽게 판별할 수 있습니다.

플래그(Flags)와 함께 사용하는 compile()

compile() 메서드의 또 다른 변형은 정수형 플래그 값을 두 번째 인자로 받습니다. 각 플래그는 선택적인 매칭 조건을 지정하며, 예를 들어 CASE_INSENSITIVE 플래그를 사용하면 대소문자를 구분하지 않고 정규 표현식을 컴파일합니다.

다음 예제는 대소문자 구분 없이 문자열 "Tutorialspoint"에서 문자 't'의 개수를 세어 봅니다.

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class CompileExample {
    public static void main(String args[]) {
        // 대소문자 구분 없이 정규 표현식 컴파일
        Pattern pattern = Pattern.compile("[t]", Pattern.CASE_INSENSITIVE);
        // Matcher 객체 가져오기
        Matcher matcher = pattern.matcher("Tutorialspoint");
        int count = 0;
        while (matcher.find()) {
            count++;
        }
        System.out.println("Number of matches: " + count);
    }
}

실행 결과

Number of matches: 3

"Tutorialspoint"에는 대문자 'T'가 1개, 소문자 't'가 2개 포함되어 있습니다. CASE_INSENSITIVE 플래그 덕분에 대소문자를 모두 매칭하여 총 3개가 검출됩니다. 만약 플래그를 지정하지 않으면 대소문자가 구분되어 소문자 't' 2개만 매칭됩니다.

이 밖에도 여러 줄 모드를 활성화하는 MULTILINE, 도트(.)가 줄바꿈 문자까지 포함하도록 하는 DOTALL 등 다양한 플래그가 있으며, 비트 OR(|) 연산자로 여러 플래그를 조합해 사용할 수도 있습니다.