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

[정규식 마스터하기] Part 3: 수량자와 반복

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

1. 기본 수량자 (*, +, ?)

* (애스터리스크) - 0회 이상 반복

패턴: ab*c
설명: a로 시작하고 c로 끝나며, b는 0번 이상 반복될 수 있음
매칭 예제:
- "ac" (b가 0번)
- "abc" (b가 1번)
- "abbc" (b가 2번)
- "abbbc" (b가 3번)

+ (플러스) - 1회 이상 반복

패턴: ab+c
설명: a로 시작하고 c로 끝나며, b는 1번 이상 반복되어야 함
매칭 예제:
- "abc" (b가 1번)
- "abbc" (b가 2번)
- "abbbc" (b가 3번)
비매칭:
- "ac" (b가 없음)

? (물음표) - 0회 또는 1회

패턴: ab?c
설명: a로 시작하고 c로 끝나며, b는 있어도 되고 없어도 됨
매칭 예제:
- "ac" (b가 없음)
- "abc" (b가 1번)
비매칭:
- "abbc" (b가 2번)

2. 중괄호를 사용한 정확한 반복 횟수 지정

{n} - 정확히 n번 반복

패턴: a{3}
매칭: "aaa"
비매칭: "aa", "aaaa"

{n,} - n번 이상 반복

패턴: a{2,}
매칭: "aa", "aaa", "aaaa"
비매칭: "a"

{n,m} - n번 이상 m번 이하 반복

패턴: a{2,4}
매칭: "aa", "aaa", "aaaa"
비매칭: "a", "aaaaa"

3. 탐욕적(Greedy) vs 게으른(Lazy) 수량자

탐욕적 수량자 (기본)

패턴: ".*"
문자열: "Hello World"
결과: "Hello World" (전체 문자열 매칭)

패턴: "<.+>"
문자열: "<h1>제목</h1>"
결과: "<h1>제목</h1>" (전체 태그 매칭)

게으른 수량자 (수량자 뒤에 ? 추가)

패턴: ".*?"
문자열: "Hello World"
결과: "" (빈 문자열 매칭)

패턴: "<.+?>"
문자열: "<h1>제목</h1>"
결과: "<h1>" (첫 번째 태그만 매칭)
728x90

4. 실전 예제와 연습문제

예제 1: HTML 태그 매칭

텍스트: "<div>내용1</div><p>내용2</p>"

탐욕적 패턴: <.*>
결과: "<div>내용1</div><p>내용2</p>" (전체 매칭)

게으른 패턴: <.*?>
결과: "<div>", "</div>", "<p>", "</p>" (개별 태그 매칭)

예제 2: 전화번호 형식 검증

패턴: ^\d{2,3}-\d{3,4}-\d{4}$
설명:
- ^\d{2,3}: 시작이 2-3자리 숫자
- -\d{3,4}: 중간이 3-4자리 숫자
- -\d{4}$: 끝이 4자리 숫자

매칭:
- "02-123-4567"
- "010-1234-5678"
비매칭:
- "2-12-1234"
- "010-12-12345"

예제 3: 이메일 주소 검증

패턴: ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
설명:
- [a-zA-Z0-9._%+-]+: 로컬 파트
- @: 구분자
- [a-zA-Z0-9.-]+: 도메인
- \.[a-zA-Z]{2,}: 최상위 도메인

매칭:
- "user@example.com"
- "user.name+tag@example.co.kr"
비매칭:
- "@example.com"
- "user@.com"

5. 실습 문제

문제 1: 주민등록번호 형식 검증

패턴: \d{6}-[1-4]\d{6}
설명:
- \d{6}: 생년월일 6자리
- -: 하이픈
- [1-4]: 성별 구분 번호
- \d{6}: 나머지 6자리

테스트:
- "901231-1234567" (매칭)
- "901231-5234567" (비매칭)

문제 2: 파일명에서 이미지 확장자 찾기

패턴: \w+\.(jpg|jpeg|png|gif)$
설명:
- \w+: 파일명
- \.: 점
- (jpg|jpeg|png|gif): 이미지 확장자
- $: 문자열 끝

테스트:
- "image.jpg" (매칭)
- "photo.png" (매칭)
- "document.pdf" (비매칭)

문제 3: URL 매칭

패턴: https?:\/\/[\w\-.]+(:\d+)?(\/\S*)?
설명:
- https?: http 또는 https
- \/\/: //
- [\w\-.]+: 도메인
- (:\d+)?: 포트번호(선택사항)
- (\/\S*)?: 경로(선택사항)

테스트:
- "https://example.com" (매칭)
- "http://localhost:8080" (매칭)
- "ftp://example.com" (비매칭)
728x90