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

Java 정규식 논리 연산자 완벽 정리: XY, X|Y, 캡처 그룹 활용법

Java 정규식(Regular Expression)은 복잡한 문자열 패턴을 효율적으로 처리할 수 있도록 3가지 논리 연산자를 지원합니다.

  • XY : X 다음에 Y가 이어지는 패턴
  • X|Y : X 또는 Y 중 하나와 일치
  • (X) : 캡처 그룹(Capturing Group)

각 연산자의 동작 방식과 실제 코드 예제를 통해 자세히 알아보겠습니다.

1. XY : X 다음에 Y가 오는 패턴

이 연산자는 두 개의 연속된 단일 문자를 순서대로 매칭하는 가장 기본적인 형태입니다. 예를 들어 정규식 am은 입력 문자열에서 'a' 바로 뒤에 'm'이 나오는 부분을 찾습니다.

예제 코드

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

public class Test {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter input text: ");
        String input = sc.nextLine();
        String regex = "am";
        // Pattern 객체 생성
        Pattern pattern = Pattern.compile(regex);
        // 컴파일된 패턴을 문자열과 매칭
        Matcher matcher = pattern.matcher(input);
        if (matcher.find()) {
            System.out.println("Match occurred");
        } else {
            System.out.println("Match not occurred");
        }
    }
}

실행 결과 1 — 매칭 성공

Enter input text:
sample text
Match occurred

'sample'이라는 단어 안에 'a'와 'm'이 연속으로 존재하므로 매칭에 성공합니다.

실행 결과 2 — 매칭 실패

Enter input text:
hello how are you
Match not occurred

입력 문자열에 'am'이 연속으로 등장하지 않으므로 매칭에 실패합니다.

2. X|Y : X 또는 Y 매칭

OR 연산자인 |(파이프)는 기호를 사이에 둔 두 표현식 또는 문자 중 어느 하나라도 일치하면 매칭됩니다. 여러 개의 대안 패턴을 검색할 때 매우 유용합니다.

예제 코드

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

public class RegexExample {
    public static void main(String args[]) {
        String regex = "Hello|welcome";
        String input = "Hello how are you welcome to Tutorialspoint";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(input);
        int count = 0;
        while(matcher.find()) {
            count++;
        }
        System.out.println("Number of matches: " + count);
    }
}

실행 결과

Number of matches: 2

입력 문자열에서 'Hello'와 'welcome' 각각 한 번씩 발견되어 총 2번의 매칭이 발생했습니다.

3. (X) : 캡처 그룹

캡처 그룹(Capturing Group)은 여러 문자를 하나의 단위로 묶어 처리할 수 있게 해주는 기능입니다. 괄호 () 안에 해당 문자들을 넣기만 하면 되며, 매칭 결과를 그룹별로 개별적으로 추출할 수 있다는 점이 큰 장점입니다.

  • group(0) : 전체 매칭 결과 반환
  • group(1), group(2), ... : 각 괄호 그룹에 해당하는 부분 반환

예제 코드

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

public class CapturingGroups {
    public static void main(String args[]) {
        System.out.println("Enter input text");
        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);
        if (matcher.find()) {
            System.out.println("Found value: " + matcher.group(0));
            System.out.println("Found value: " + matcher.group(1));
            System.out.println("Found value: " + matcher.group(2));
            System.out.println("Found value: " + matcher.group(3));
        } else {
            System.out.println("NO MATCH");
        }
    }
}

실행 결과

Enter input text
sample data with 1234 (digits) in middle
Found value: sample data with 1234 (digits) in middle
Found value: sample data with 123
Found value: 4
Found value: (digits) in middle

위 예제에서 정규식 (.*)(\d+)(.*)는 세 개의 그룹으로 구성됩니다.

  • 그룹 1 (.*) : 숫자 앞까지의 모든 문자 ('sample data with 123')
  • 그룹 2 (\d+) : 마지막 숫자 ('4') — .*가 탐욕적(greedy)으로 동작하기 때문에 숫자 중 마지막 한 글자만 남게 됩니다.
  • 그룹 3 (.*) : 숫자 뒤의 모든 문자 ('(digits) in middle')

마무리

Java 정규식의 논리 연산자를 정리하면 다음과 같습니다.

  • XY — 두 문자/표현식의 순차적 결합
  • X|Y — OR 조건으로 대안 패턴 매칭
  • (X) — 문자열을 그룹화하여 부분 추출 가능

이 세 가지 연산자만 잘 활용해도 전화번호, 이메일, 날짜 형식 검증 등 실무에서 자주 사용되는 문자열 처리 작업을 훨씬 간결하게 구현할 수 있습니다.