java.util.regex.Pattern 클래스의 UNIX_LINES 필드는 정규 표현식에서 유닉스 라인(Unix Lines) 모드를 활성화하는 플래그입니다.
이 모드가 켜지면 줄 종결자(line terminator)로 오직 '\n'(줄 바꿈 문자)만 인식됩니다. 따라서 '\r'(캐리지 리턴)은 더 이상 특수한 제어 문자가 아니라 일반 리터럴 문자로 취급됩니다.
UNIX_LINES 모드의 동작 방식
정규 표현식에서 ^(문장 시작)와 $(문장 끝) 매처는 기본적으로 줄 종결자를 기준으로 동작합니다. 유닉스 라인 모드에서는 '\r'이 줄 구분자로 인식되지 않기 때문에, 멀티라인 입력에서 매칭 결과가 크게 달라질 수 있습니다.
- 유닉스 라인 모드:
'\n'만 줄 종결자로 인식 →'\r'은 일반 문자 - 일반(기본) 모드:
'\r'도 줄 종결자로 인식됨
예제 1 – UNIX_LINES 플래그 적용
아래 예제에서는 Pattern.compile() 메서드에 두 번째 인자로 Pattern.UNIX_LINES를 전달하여 컴파일합니다. 입력 문자열은 각 줄이 '\r'로 끝나며, 정규 표현식 ^T.*e는 'T'로 시작하고 'e'로 끝나는 문자열을 찾습니다.
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class UnixLinesExample {
public static void main(String[] args) {
String input = "This is the first line\r"
+ "This is the second line\r"
+ "This is the third line\r";
// 'T'로 시작하고 'e'로 끝나는 문자열을 찾는 정규 표현식
String regex = "^T.*e";
// UNIX_LINES 플래그를 적용하여 Pattern 객체 생성
Pattern pattern = Pattern.compile(regex, Pattern.UNIX_LINES);
// Matcher 객체 생성
Matcher matcher = pattern.matcher(input);
int count = 0;
while (matcher.find()) {
count++;
System.out.println(matcher.group());
}
System.out.println("매칭 횟수: " + count);
}
}
실행 결과
This is the first line This is the second line This is the third line 매칭 횟수: 1
결과 분석: 유닉스 라인 모드에서는 '\r'이 줄 종결자로 인식되지 않으므로, 세 개의 줄이 하나의 긴 문자열로 간주됩니다. 그 결과 ^T.*e 패턴은 전체 문자열에서 단 한 번만 매칭되고, 출력에는 세 줄이 함께 표시됩니다.
예제 2 – 일반 모드와의 비교
이번에는 UNIX_LINES 플래그 없이 동일한 코드를 실행해 보겠습니다. 일반 모드에서는 '\r'이 캐리지 리턴, 즉 줄 종결자로 처리됩니다.
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class DefaultModeExample {
public static void main(String[] args) {
String input = "This is the first line\r"
+ "This is the second line\r"
+ "This is the third line\r";
// 'T'로 시작하고 'e'로 끝나는 문자열을 찾는 정규 표현식
String regex = "^T.*e";
// 플래그 없이 Pattern 객체 생성 (일반 모드)
Pattern pattern = Pattern.compile(regex);
// Matcher 객체 생성
Matcher matcher = pattern.matcher(input);
int count = 0;
while (matcher.find()) {
count++;
System.out.println(matcher.group());
}
System.out.println("매칭 횟수: " + count);
}
}
실행 결과
This is the first line 매칭 횟수: 1
결과 분석: 일반 모드에서는 '\r'이 줄 종결자로 작동하기 때문에, ^ 매처가 첫 번째 줄의 시작에만 적용됩니다. 따라서 첫 번째 줄인 This is the first line만 매칭됩니다.
정리
Pattern.UNIX_LINES 플래그는 주로 유닉스 계열 시스템에서 생성된 텍스트 파일을 다룰 때 유용합니다. Windows(\r\n)와 유닉스(\n)의 줄 바꿈 방식 차이 때문에 정규 표현식 매칭 결과가 달라지는 문제를 해결할 수 있으며, 두 예제의 출력 차이를 통해 플래그의 실질적인 영향을 확인할 수 있습니다.