코드 한 줄의 기록

Java 정규표현식(java.util.regex) 기초 완벽 가이드: 초보 개발자를 위한 이해하기 쉬운 학습 노트 본문

JAVA

Java 정규표현식(java.util.regex) 기초 완벽 가이드: 초보 개발자를 위한 이해하기 쉬운 학습 노트

CodeByJin 2025. 10. 3. 08:58
반응형

Java 개발자로서 문자열 처리 작업을 하다 보면 복잡한 패턴 매칭이나 텍스트 검증이 필요할 때가 많습니다. 이때 정규표현식(Regular Expression, 줄여서 RegEx)은 매우 강력한 도구로, 단 몇 줄의 코드만으로도 복잡한 문자열 탐색, 치환, 검증 로직을 간결하게 구현할 수 있습니다. 이번 글에서는 java.util.regex 패키지를 이용한 Java 정규표현식의 기본 개념과 사용법을 직접 따라 써 보며 익힐 수 있도록 구성했습니다. 초보자도 부담 없이 읽을 수 있도록 단계별 예제와 함께 설명하니, 코드 예제를 하나씩 직접 실행해 보며 이해해 보세요.

정규표현식이란 무엇인가?

정규표현식은 특정한 규칙을 가진 문자열 집합을 표현하는 형식 언어입니다. 예를 들어 이메일 주소, 휴대폰 번호, 주민등록번호처럼 형식이 정해진 텍스트를 검증하거나, 로그 파일에서 원하는 패턴을 추출할 때 유용하죠. 프로그래밍 언어마다 지원 방식이 다르지만, Java에서는 java.util.regex 패키지에 Pattern과 Matcher 두 클래스로 구현되어 있습니다.

java.util.regex 주요 클래스

Java 정규표현식을 사용할 때 반드시 알아야 할 두 가지 클래스가 있습니다.

  1. Pattern
    - 컴파일된 정규표현식 객체를 나타냅니다.
    - Pattern.compile(정규표현식, 옵션) 메서드를 통해 생성합니다.
  2. Matcher
    - Pattern으로부터 생성된 Matcher는 대상 문자열에 정규표현식을 적용하여 실제 매칭 작업을 수행합니다.
    - pattern.matcher(대상문자열)로 생성하고, find(), matches(), replaceAll() 등을 호출합니다.
String regex = "\\d{3}-\\d{4}";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher("010-1234");
boolean matched = matcher.matches(); // true

 

위 코드는 3자리 숫자-4자리 숫자 형식(\\d{3}-\\d{4})에 대상 문자열이 일치하는지 검사합니다.

핵심 메서드와 사용법

matches()와 find() 차이

  • matches(): 전체 문자열이 정규표현식과 완전히 일치해야 true를 반환합니다.
  • find(): 문자열 어딘가에 패턴이 부분적으로 일치하면 true를 반환합니다.
Pattern p = Pattern.compile("cat");
Matcher m = p.matcher("concatenate");
m.matches(); // false, 전체가 cat과 같지 않음
m.find();    // true, 문자열에 cat이 포함되어 있음

 

replaceAll()과 replaceFirst()

  • replaceAll(치환할문자열): 일치하는 모든 패턴을 치환합니다.
  • replaceFirst(치환할문자열): 첫 번째 매칭 결과만 치환합니다.
Pattern p = Pattern.compile("\\s+");
Matcher m = p.matcher("Java   Regular   Expression");
String resultAll   = m.replaceAll(" ");    // 모든 연속 공백을 하나의 공백으로
// resultAll == "Java Regular Expression"

 

그룹핑(그룹 캡처)

정규표현식 내에서 소괄호 ( )를 사용해 하위 패턴을 그룹으로 묶고, 매칭된 텍스트를 추출하거나 재참조(back-reference)할 수 있습니다.

Pattern p = Pattern.compile("(\\d{4})-(\\d{2})-(\\d{2})");
Matcher m = p.matcher("2025-10-01");
if (m.matches()) {
    String year  = m.group(1); // 2025
    String month = m.group(2); // 10
    String day   = m.group(3); // 01
}

 

그룹 캡처는 종종 치환 문자열에서 $1, $2와 같이 사용되어 유연한 치환을 제공합니다.

자주 쓰이는 메타문자와 특수 기호

정규표현식 학습의 핵심은 메타문자를 제대로 이해하는 것입니다. 주요 메타문자는 다음과 같습니다.

  • . : 임의의 한 문자
  • \d: 숫자 (0-9)
  • \D: 숫자 이외
  • \w: 단어 문자 (영숫자 및 언더스코어)
  • \W: 단어 문자가 아닌 것
  • \s: 공백 문자 (스페이스, 탭, 개행)
  • \S: 공백이 아닌 문자
  • ^: 문자열 시작 위치
  • $: 문자열 끝 위치
  • ?: 앞문자가 0 또는 1회
  • *: 앞문자가 0회 이상
  • +: 앞문자가 1회 이상
  • {n}: 앞문자가 정확히 n회
  • {n,}: n회 이상
  • {n,m}: n회 이상 m회 이하
  • |: OR 연산 (alternation)
  • () : 그룹핑
  • []: 문자 클래스 (문자 집합)

실제 예시를 통해 보겠습니다.

String regex = "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}$";
Pattern emailPattern = Pattern.compile(regex);

 

위 정규표현식은 이메일 주소 형식을 간단히 검증합니다. ^$를 사용해 전체 문자열 매치를 보장하며, []를 활용해 허용 문자 집합을 정의합니다.

정규표현식 옵션(Flags)

Pattern 클래스는 옵션을 통해 대소문자 구분 여부, 멀티라인 처리, DOTALL 모드 등을 제어할 수 있습니다.

  • Pattern.CASE_INSENSITIVE: 대소문자 구분 없이 매칭
  • Pattern.MULTILINE: ^, $이 각 라인의 시작/끝으로 동작
  • Pattern.DOTALL: .이 개행 문자까지 포함
  • Pattern.UNICODE_CASE: 유니코드 대소문자 구분
Pattern p = Pattern.compile("hello.*world", Pattern.CASE_INSENSITIVE|Pattern.DOTALL);

실전 예제: 로그 파일에서 IP 추출하기

웹 서버 로그에서 접속한 클라이언트 IP 주소를 추출한다고 가정해 보겠습니다.

String logLine = "2025-10-01 12:00:00 INFO Client connected from 192.168.0.42";
String ipRegex = "(\\d{1,3}\\.){3}\\d{1,3}";
Pattern ipPattern = Pattern.compile(ipRegex);
Matcher ipMatcher = ipPattern.matcher(logLine);
if (ipMatcher.find()) {
    System.out.println("IP 주소: " + ipMatcher.group());
}

 

위 예제에서 (\\d{1,3}\\.){3}\\d{1,3} 패턴은 각 옥텟이 1~3자리 숫자로 구성되고 점(.)으로 구분된 형태임을 나타냅니다.

팁과 주의사항

정규표현식은 강력하지만 과하게 복잡해지기 쉽습니다. 유지보수와 가독성을 위해 다음을 권장합니다.

  1. 주석과 설명: Java 7 이상부터 (?x) 플래그를 사용해 패턴 내에 공백과 주석을 삽입할 수 있습니다.
  2. Pattern.compile 재사용: 동일 패턴을 반복적으로 사용할 경우 컴파일 비용이 크므로 static 상수로 선언해 재사용하세요.
  3. 과도한 백트래킹 주의: 복잡한 패턴에서 입력 문자열이 길어지면 탐색 시간이 급격히 늘어날 수 있습니다. 단순화하거나 별도 검증 로직을 추가하세요.
  4. 라이브러리 활용: 이메일, URL 검증 등 자주 쓰이는 패턴은 Apache Commons Validator, Guava 등 검증 라이브러리를 활용하면 편리합니다.

이번 글에서는 java.util.regex 패키지를 기반으로 정규표현식의 기초부터 주요 메타문자, 그룹핑, 옵션 활용, 실전 예제까지 폭넓게 다뤄 보았습니다. 직접 여러 예제를 실행해 보면서 패턴을 변경해 보고, 다양한 문자열에 적용해 보세요. 정규표현식을 제대로 익히면 문자열 처리 로직을 한결 단순화할 수 있어 생산성이 크게 향상됩니다. 앞으로 Java 개발 과정에서 유연하고 강력한 텍스트 처리를 경험해 보시길 바랍니다.

 

 

Java 문자열 포맷팅 완벽 가이드: String.format과 Formatter 사용법 소개

Java에서 문자열을 가공하거나 출력할 때 String.format 메서드와 Formatter 클래스를 활용하면 코드 가독성과 유지보수성을 크게 높일 수 있습니다. 본 글에서는 Java 문자열 포맷팅의 핵심 개념을 살펴

byteandbit.tistory.com

 

반응형