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) — 문자열을 그룹화하여 부분 추출 가능
이 세 가지 연산자만 잘 활용해도 전화번호, 이메일, 날짜 형식 검증 등 실무에서 자주 사용되는 문자열 처리 작업을 훨씬 간결하게 구현할 수 있습니다.