정규 표현식에서 하위 표현식(subexpression), 즉 메타문자 "( )"는 여러 개의 정규 표현식을 하나의 그룹으로 묶어주고, 매칭된 텍스트를 기억하는 역할을 합니다. 그룹화를 활용하면 복잡한 패턴을 논리적으로 구성할 수 있으며, 캡처된 결과를 나중에 참조할 수도 있습니다.
예제 1: 그룹화를 이용한 대체 패턴 매칭
다음 예제에서는 괄호 안에 OR 연산자(|)를 사용하여 "Hell" 또는 "How"로 시작하는 문자열을 찾습니다.
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example {
public static void main( String args[] ) {
String input = "Hello how are you welcome to Tutorialspoint";
String regex = "H(ell|ow)";
// 정규 표현식 컴파일
Pattern pattern = Pattern.compile(regex);
// Matcher 객체 생성
Matcher matcher = pattern.matcher(input);
if(matcher.find()) {
System.out.println("Match found");
} else {
System.out.println("Match not found");
}
}
}실행 결과
Match found
입력 문자열에는 "Hello"가 포함되어 있으므로, 그룹 (ell|ow)가 "ell"과 일치하여 전체 패턴이 매칭됩니다.
예제 2: 숫자를 포함한 문장 매칭
다음 예제에서는 숫자를 포함하고 있는 문장을 매칭해 보겠습니다. 여기서 (?:.*)는 비캡처 그룹(non-capturing group)으로, 매칭은 수행하지만 결과를 기억하지 않습니다.
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 input string: ");
Scanner sc = new Scanner(System.in);
String input = sc.nextLine();
// 그룹을 사용한 정규 표현식
String regex = "(?:.*)(\\d+)(.*)";
// Pattern 객체 생성
Pattern pattern = Pattern.compile(regex);
// Matcher 객체 생성
Matcher matcher = pattern.matcher(input);
boolean bool = matcher.matches();
if(bool) {
System.out.println("Match found");
} else {
System.out.println("Match not found");
}
}
}실행 결과
Enter input string: This is a 5363 test string Match found
핵심 정리
- ( ): 정규 표현식을 그룹으로 묶고 매칭된 텍스트를 캡처하여 기억합니다.
- (?: ): 비캡처 그룹으로, 그룹화는 하지만 매칭 결과를 저장하지 않아 성능상 유리합니다.
- | (OR 연산자): 그룹 내에서 여러 대체 패턴 중 하나와 일치하도록 지정합니다.
- \\d+: 하나 이상의 숫자를 의미합니다.
이처럼 하위 표현식을 적절히 활용하면 복잡한 문자열 패턴도 체계적이고 효율적으로 처리할 수 있습니다.