Java에서 정규 표현식(Regular Expression, Regex)은 문자열의 패턴을 정의하여 검색, 매칭, 수정 등의 작업에 활용할 수 있는 강력한 도구입니다. 특히 문자열의 유효성 검사, 특정 패턴 추출, 텍스트 변환 작업에 자주 사용됩니다. 이 글에서는 Java에서 정규 표현식을 사용하는 방법에 대해 상세히 설명합니다.
1. 정규 표현식의 기본 개념
정규 표현식은 특정 패턴을 가진 문자열을 처리하기 위해 사용됩니다. 예를 들어 이메일 주소의 유효성을 검사하거나 특정 형식의 데이터를 추출할 때 사용됩니다. Java에서는 java.util.regex 패키지를 통해 정규 표현식을 제공합니다.
java.util.regex 패키지의 주요 클래스:
- Pattern : 정규 표현식을 정의하고 컴파일하는 클래스입니다.
- Matcher : Pattern과 연결된 문자열에서 패턴을 검색하는 클래스입니다.
2. Java에서 정규 표현식을 활용하는 기본 구조
(1) Pattern 객체 생성
정규 표현식을 Pattern.compile(String regex) 메서드를 사용하여 컴파일합니다.
(2) Matcher 객체 생성
Pattern 객체의 matcher(String input) 메서드를 통해 검사할 문자열을 입력합니다.
(3) 패턴 매칭 실행
Matcher 클래스의 다양한 메서드를 활용하여 매칭 작업을 수행합니다.
import java.util.regex.*;
public class RegexExample {
public static void main(String[] args) {
// 1. 정규 표현식 정의 및 컴파일
String regex = "\\d+"; // 숫자로만 구성된 문자열을 찾는 패턴
Pattern pattern = Pattern.compile(regex);
// 2. 문자열 입력 및 Matcher 객체 생성
String input = "123 ABC 456";
Matcher matcher = pattern.matcher(input);
// 3. 패턴 매칭
while (matcher.find()) {
System.out.println("Matched: " + matcher.group());
}
}
}
// 출력
Matched: 123
Matched: 456
3. 주요 메서드와 설명
(1) Pattern 클래스의 주요 메서드
- compile (String regex) : 정규 표현식을 컴파일하여 Pattern 객체를 생성합니다.
- matches (String regex, CharSequence input) : 문자열 전체가 정규 표현식과 일치하는지 확인합니다.
- split (CharSequence input) : 정규 표현식을 기준으로 문자열을 분리합니다.
String input = "apple,orange,banana";
String regex = ",";
Pattern pattern = Pattern.compile(regex);
String[] result = pattern.split(input);
for (String word : result) {
System.out.println(word);
}
(2) Matcher 클래스의 주요 메서드
- find() : 입력 문자열에서 패턴에 매칭되는 부분 문자열을 찾습니다.
- group() : 마지막으로 매칭된 부분 문자열을 반환합니다.
- matches() : 입력 문자열 전체가 패턴과 일치하는지 확인합니다.
- start() : 매칭된 문자열의 시작 인덱스를 반환합니다.
- end() : 매칭된 문자열의 끝 인덱스를 반환합니다.
- replaceAll(String replacement): 모든 매칭된 부분 문자열을 대체합니다.
String input = "This is a test 123.";
String regex = "\\d+"; // 숫자 패턴
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
if (matcher.find()) {
System.out.println("Matched: " + matcher.group());
System.out.println("Start Index: " + matcher.start());
System.out.println("End Index: " + matcher.end());
}
4. 정규 표현식의 특수 문자
(1) .
- 임의의 한 문자
- a.c -> abc
(2) *
- 앞의 문자가 0번 이상 반복
- ab* -> a, ab, abb
(3) +
- 앞의 문자가 1번 이상 반복
- ab+ -> ab, abb
(4) ?
- 앞의 문자가 0번 또는 1번 나타남
- ab? -> a, ab
(5) \d
- 숫자
- \d+ -> 123
(6) \w
- 알파벳, 숫자, 밑줄
- \w+ -> word
(7) \s
- 공백 문자
- \s+ ->
(8) ^
- 문자열의 시작
-^Hello
(9) $
- 문자열의 끝
- World$
5. 응용 : 이메일 유효성 검사
정규 표현식을 활용한 실용적인 예로 이메일 유효성 검사를 살펴보겠습니다.
import java.util.regex.*;
public class EmailValidation {
public static void main(String[] args) {
String email = "example@test.com";
String regex = "^[\\w.-]+@[\\w.-]+\\.[a-zA-Z]{2,}$";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(email);
if (matcher.matches()) {
System.out.println(email + " is a valid email address.");
} else {
System.out.println(email + " is not a valid email address.");
}
}
}
//출력
example@test.com is a valid email address.
6. 정규 표현식과 성능 고려사항
- Pattern 재사용 : 정규 표현식은 컴파일 비용이 크므로 반복적으로 사용할 경우 Pattern 객체를 재사용하세요.
- 입력 데이터 검증 : 정규 표현식이 과도하게 복잡할 경우 성능 저하를 초래 할 수 있습니다. 입력 데이터 크기와 패턴 복잡성을 고려하세요.
// Pattern 재사용 예제
Pattern pattern = Pattern.compile("\\d+");
for (String input : new String[] {"123", "456", "789"}) {
Matcher matcher = pattern.matcher(input);
System.out.println(matcher.matches());
}
7. 결론
Java에서 정규 표현식은 문자열 처리의 강력한 도구입니다. java.util.regex 패키지를 사용하면 다양한 문자열 검색, 매칭, 수정 작업을 손쉽게 처리할 수 있습니다. 하지만 성능과 유지 보수를 고려하여 적절한 패턴을 설계하고 사용하는 것이 중요합니다.
'프로그래밍' 카테고리의 다른 글
Java 람다식(Lambda Expressions) (0) | 2025.01.04 |
---|---|
Python Pandas로 데이터 분석 기초 (1) | 2025.01.02 |
코드 문서화를 간단하게 유지하는 방법 (2) | 2024.12.31 |
JavaScript에서 Symbol과 고유성 활용 (0) | 2024.12.30 |
IT 스타트업에서의 협업 도구 활용 : 도구 추천, 활용 방법, 장단점 (2) | 2024.12.29 |