본문 바로가기
IT 개발/정규식

[정규식 마스터하기] Part 5: 그룹과 캡처

by 이것 저것 모든것 2025. 2. 17.
728x90

1. 그룹화 기본 ()

기본 그룹화

패턴: (abc)+
설명: 'abc'를 하나의 그룹으로 처리하여 반복
매칭:
- "abc"
- "abcabc"
- "abcabcabc"

그룹화의 장점

  • 반복 수량자 적용 가능
  • 그룹 전체를 하나의 단위로 처리
  • 캡처된 값을 나중에 참조 가능

2. 캡처 그룹과 비캡처 그룹

캡처 그룹

패턴: ([a-z]+)-(\d+)
설명: 문자열과 숫자를 각각 캡처
예제:
텍스트: "order-123"
캡처 결과:
- 그룹 1: "order"
- 그룹 2: "123"

비캡처 그룹 (?:)

패턴: (?:[a-z]+)-(\d+)
설명: 문자열은 캡처하지 않고 숫자만 캡처
예제:
텍스트: "order-123"
캡처 결과:
- 그룹 1: "123"

3. 역참조 사용법

기본 역참조

패턴: ([a-z])\1
설명: 같은 문자가 연속으로 두 번 나타나는 패턴
매칭:
- "aa", "bb", "cc"
비매칭:
- "ab", "cd"

HTML 태그 매칭

패턴: <([a-z]+)>.*?</\1>
설명: 열린 태그와 닫힌 태그가 일치하는지 확인
매칭:
- "<div>content</div>"
- "<span>text</span>"
비매칭:
- "<div>content</span>"

4. 이름 있는 그룹

기본 문법

패턴: (?<name>[a-z]+)
설명: 그룹에 이름을 부여하여 참조

실제 예제

패턴: (?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})
설명: 날짜 형식에서 각 부분에 이름 부여
매칭:
텍스트: "2024-02-12"
캡처 결과:
- year: "2024"
- month: "02"
- day: "12"

5. 그룹 내 선택자 (|)

기본 사용법

패턴: (cat|dog)
설명: cat 또는 dog 매칭
매칭:
- "cat"
- "dog"
비매칭:
- "bird"

복잡한 선택 패턴

패턴: (https?|ftp)://([^/\r\n]+)(/[^\r\n]*)?
설명: URL 프로토콜, 도메인, 경로 매칭
매칭:
- "http://example.com"
- "https://example.com/path"
- "ftp://server.com"
728x90

6. 실습 예제

예제 1: 이메일 주소 파싱

패턴: (?<username>[a-zA-Z0-9._%+-]+)@(?<domain>[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})
설명:
- username: 로컬 파트
- domain: 도메인 부분

테스트:
"user@example.com"
결과:
- username: "user"
- domain: "example.com"

예제 2: HTML 태그 속성 추출

패턴: <(?<tag>[a-z]+)(?<attrs>\s+[^>]+)?>
설명:
- tag: 태그 이름
- attrs: 속성들

테스트:
"<div class="container" id="main">"
결과:
- tag: "div"
- attrs: ' class="container" id="main"'

예제 3: 전화번호 형식 변환

패턴: (\d{3})-(\d{4})-(\d{4})
치환: ($1) $2-$3
설명: 전화번호 형식 변경

입력: "010-1234-5678"
출력: "(010) 1234-5678"

7. 실습 문제

문제 1: 반복되는 단어 찾기

패턴: \b(\w+)\s+\1\b
설명: 연속으로 반복되는 단어 찾기

테스트:
- "the the" (매칭)
- "hello world" (비매칭)

문제 2: 올바른 괄호 쌍 확인

패턴: \(([^()]*)\)
설명: 중첩되지 않은 괄호와 그 내용 매칭

테스트:
- "(hello)" (매칭)
- "((hello))" (부분 매칭)
- "hello)" (비매칭)

문제 3: CSV 데이터 파싱

패턴: (?<field>[^,\n]*),(?<value>[^,\n]*)
설명: CSV 형식의 필드와 값 추출

테스트:
"name,John"
결과:
- field: "name"
- value: "John"
728x90