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

Java 정규식 - 다른 매칭 결과 내부에서 패턴 찾기

정규식을 사용할 때 어떤 패턴에 매칭된 결과 안에서 또 다른 패턴을 찾아야 하는 경우가 있습니다. 이를 구현하려면 먼저 외부 패턴에 맞는 정규식을 컴파일하고, 해당 패턴과 일치하는 문자열을 찾은 뒤, 그 결과를 추출하여 내부 Matcher 객체의 입력값으로 전달하면 됩니다.

즉, 바깥쪽 매칭 → 그룹 추출 → 안쪽 매칭의 순서로 두 단계에 걸쳐 처리하는 방식입니다.

예제 코드

다음 예제는 입력 문자열에서 <b>...</b> 태그로 감싸진 부분(외부 패턴)을 먼저 찾고, 그 안에서 숫자(\d+, 내부 패턴)를 추출하는 프로그램입니다.

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MatcherExample {
    public static void main(String[] args) {
        int start = 0, len = -1;
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter input text: ");
        String input = sc.nextLine();
        String regexOuter = "<b>(.*?)</b>";
        String regexInner = "\\d+";
        //패턴 객체 생성
        Pattern patternOuter = Pattern.compile(regexOuter);
        Pattern patternInner = Pattern.compile(regexInner);
        //문자열에서 컴파일된 패턴과 매칭 수행
        Matcher outerMatcher = patternOuter.matcher(input);
        while (outerMatcher.find()) {
            Matcher innerMatcher = patternInner.matcher(outerMatcher.group(1));
            while(innerMatcher.find()){
                System.out.println(innerMatcher.group());
            }
        }
    }
}

실행 결과

Enter input text:
This is sample HTML data <b>123 sample text</b> hello
123

동작 원리

이 코드의 동작 과정을 단계별로 살펴보면 다음과 같습니다.

1단계 - 외부 패턴 매칭: regexOuter(<b>(.*?)</b>)로 전체 입력 문자열을 검색합니다. 여기서 (.*?)는 캡처 그룹으로, <b></b> 태그 사이의 모든 내용을 담습니다.

2단계 - 캡처 그룹 추출: outerMatcher.group(1)을 호출하면 첫 번째 캡처 그룹, 즉 태그 내부의 텍스트("123 sample text")를 얻을 수 있습니다.

3단계 - 내부 패턴 매칭: 추출한 텍스트를 새로운 Matcher 객체의 대상 문자열로 지정하고, \d+ 패턴으로 숫자를 검색합니다. 이 예제에서는 "123"이 출력됩니다.

이처럼 Matcher 객체는 생성 시 전달된 문자열만을 대상으로 작동하기 때문에, 외부 매칭 결과를 별도의 입력으로 넘겨주면 중첩된 패턴 검색을 손쉽게 구현할 수 있습니다.