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

Java 정규식 하위 표현식 (?:re) — 비캡처링 그룹의 이해와 활용

정규식의 메타문자 (?:re)는 일치하는 텍스트를 기억하지 않고 정규식을 그룹화하는 역할을 합니다. 흔히 비캡처링 그룹(non-capturing group)이라고 불리며, 일반 그룹인 소괄호 ()와 달리 매칭 결과를 별도로 저장하지 않기 때문에 그룹 참조가 필요 없는 경우에 유용합니다.

비캡처링 그룹 (?:re)란?

일반적인 캡처링 그룹 (re)는 매칭된 텍스트를 내부적으로 저장하여 나중에 역참조(backreference)나 추출에 활용할 수 있습니다. 반면 (?:re)는 단순히 여러 표현식을 하나의 논리적 단위로 묶어주는 역할만 수행하므로, 다음과 같은 장점이 있습니다.

  • 매칭 성능이 약간 향상됩니다.
  • 그룹 번호가 불필요하게 증가하지 않아 다른 캡처링 그룹의 인덱스 관리가 쉬워집니다.
  • 단순히 그룹화만 필요한 경우 코드 의도를 더 명확하게 표현할 수 있습니다.

예제 코드

아래 예제는 사용자로부터 문자열을 입력받아, 정규식 (?:[0-9])를 사용해 숫자가 포함되어 있는지 확인하는 프로그램입니다.

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

public class PatternExample {
    public static void main(String args[]) {
        // 사용자로부터 문자열 입력 받기
        System.out.println("Enter a String");
        Scanner sc = new Scanner(System.in);
        String input = sc.next();

        // 비캡처링 그룹을 사용한 정규식 정의
        String regex = "(?:[0-9])";

        // 정규식 컴파일
        Pattern pattern = Pattern.compile(regex);

        // Matcher 객체 생성
        Matcher matcher = pattern.matcher(input);

        // 매칭 여부 확인
        boolean bool = matcher.find();
        if(bool) {
            System.out.print("Match found");
        } else {
            System.out.print("Match not found");
        }
    }
}

실행 결과

Enter a String
9848022338
Match found

코드 설명

입력된 문자열 9848022338에는 숫자 0~9 범위의 문자가 포함되어 있으므로, 정규식 (?:[0-9])와 일치하여 "Match found"가 출력됩니다. 만약 입력 문자열에 숫자가 전혀 없다면 "Match not found"가 출력됩니다.

이 예제에서 (?:[0-9])[0-9]와 사실상 동일한 동작을 하지만, 그룹화가 필요한 더 복잡한 패턴(예: (?:ab)+, (?:https?|ftp)://)에서 반복 연산자나 선택 연산자와 함께 사용하면 그 진가를 발휘합니다.