정규식의 메타문자 (?: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)://)에서 반복 연산자나 선택 연산자와 함께 사용하면 그 진가를 발휘합니다.