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

Java 정규식으로 여러 줄 텍스트 매칭하는 방법

Java에서 정규식을 사용할 때 입력 데이터가 여러 줄로 구성되어 있는 경우, 각 줄별로 패턴을 매칭하거나 검색해야 할 때가 있습니다. 이 글에서는 여러 줄 문자열을 줄 단위로 나누어 정규식 매칭을 수행하는 방법을 단계별로 살펴봅니다.

여러 줄 데이터 매칭 절차

여러 줄로 된 입력 데이터를 정규식으로 매칭하려면 다음 순서대로 진행합니다.

  • 입력 문자열을 준비합니다.

  • split() 메서드에 "\r?\n"을 인자로 전달하여 문자열을 줄 단위 토큰 배열로 분리합니다.

  • Pattern 클래스의 compile() 메서드를 사용하여 필요한 정규식을 컴파일합니다.

  • matcher() 메서드를 호출하여 Matcher 객체를 생성합니다.

  • for 루프 안에서 find() 메서드를 사용해 배열의 각 요소(각 줄)에서 일치 항목을 찾습니다.

  • reset() 메서드를 사용하여 Matcher의 입력 대상을 배열의 다음 요소로 재설정합니다.

예제 코드

아래 예제는 세 줄로 이루어진 문자열에서 각 줄에 포함된 숫자(\d)를 찾아 출력합니다.

import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MatchingText{
    public static void main(String[] args) {
        String input = "sample text line 1 \n line2 353 35 63 \n line 3 53 35";
        String regex = "\\d";
        String[] strArray = input.split("\r?\n");
        // Pattern 객체 생성
        Pattern pattern = Pattern.compile(regex);
        // 컴파일된 패턴으로 Matcher 객체 생성
        Matcher matcher = pattern.matcher(input);
        for (int i = 0; i < strArray.length; i++) {
            matcher.reset(strArray[i]);
            System.out.println("Line:: "+(i+1));
            while (matcher.find()) {
                System.out.print(matcher.group()+" ");
            }
        System.out.println();
        }
    }
}

실행 결과

Line:: 1
1
Line:: 2
2 3 5 3 3 5 6 3
Line:: 3
3 5 3 3 5

코드 설명

split("\r?\n")은 Windows 계열의 캐리지 리턴(CR)과 유닉스 계열의 개행 문자(LF)를 모두 처리할 수 있도록 하는 패턴입니다. 이를 통해 운영체제와 무관하게 줄을 안전하게 분리할 수 있습니다.

Matcher 객체는 한 번 find()를 호출하고 나면 내부 위치가 이동하기 때문에, 새로운 문자열에 대해 매칭을 수행하려면 반드시 reset() 메서드로 입력을 재설정해야 합니다. 위 예제에서는 루프가 돌 때마다 reset(strArray[i])를 호출하여 각 줄을 순서대로 검사합니다.

참고: MULTILINE 플래그 활용

줄 단위 분리 없이 전체 문자열에서 줄 경계를 기준으로 매칭하고 싶다면 Pattern.compile(regex, Pattern.MULTILINE)처럼 MULTILINE 플래그를 사용하는 방법도 있습니다. 이 경우 ^와 $가 각 줄의 시작과 끝을 의미하게 되므로, 상황에 따라 더 간결한 코드를 작성할 수 있습니다.