정규 표현식
쉽게 말하면
정규 표현식은 글자의 생김새를 기호로 적는 규칙이에요. '숫자로만 된', '@가 들어간', '세 자리에서 네 자리' 같은 조건을 정밀하게 검사해요. LIKE가 '010으로 시작'만 볼 수 있다면, 정규 표현식은 '010-숫자 네 자리-숫자 네 자리'까지 검사할 수 있어요.
시험용 정의
정규 표현식은 문자열의 모양(패턴)을 기호로 적는 방법이다. LIKE의 %와 _보다 훨씬 정밀하게 "숫자로만", "@가 들어간", "3~4자리" 같은 규칙을 표현한다. Oracle은 REGEXP_LIKE(맞는지, 조건), REGEXP_REPLACE(바꾸기), REGEXP_SUBSTR(꺼내기), REGEXP_INSTR(위치), REGEXP_COUNT(개수)를 제공한다.
비유로 이해하기
주민센터 서류 검사 도장이다. LIKE는 "010으로 시작하면 통과" 정도만 보지만, 정규 표현식은 "010-네 자리-네 자리, 숫자만"처럼 칸마다 규칙을 정해 검사한다.
자세히
먼저 알아 둘 말
| 말 | 뜻 |
|---|---|
| 메타문자 | 글자 그대로가 아니라 규칙을 뜻하는 특수 기호. . * + ? ^ $ [ ] ( ) | |
| 수량자 | 앞 글자가 몇 번 나오는지: * + ? {n} {n,m} |
| POSIX 문자 클래스 | [:digit:]처럼 이름으로 쓴 문자 묶음. 대괄호 안에 [[:digit:]]로 쓴다 |
| MEMBER | 이 페이지의 연습용 표. ID, NAME, PHONE, EMAIL |
메타문자
| 기호 | 뜻 | 예 |
|---|---|---|
| . | 아무 문자 한 개 | a.c → abc, a1c |
| * | 앞 문자 0번 이상 | ab* → a, ab, abb |
| + | 앞 문자 1번 이상 | ab+ → ab, abb |
| ? | 앞 문자 0~1번 | colou?r → color, colour |
| {n} {n,} {n,m} | 정확히 n번 / n번 이상 / n~m번 | [0-9]{3,4} |
| ^ / $ | 문자열 시작 / 끝 | ^010, com$ |
| [abc] / [^abc] | 괄호 안 한 글자 / 괄호 안 글자 제외 | [^@]+ → @가 아닌 글자들 |
| a|b | a 또는 b | ^(K|L) |
| ( ) | 묶기, 하위 표현식. REPLACE에서 \1로 다시 쓴다 | (\d{3})-(\d{4}) |
| \d \w \s | 숫자 / 영문·숫자·_ / 공백 (Perl 확장) | \d+ |
POSIX 문자 클래스
| 클래스 | 뜻 |
|---|---|
| [:digit:] | 숫자 (\d) |
| [:alpha:] | 영문자 |
| [:alnum:] | 영문자와 숫자 |
| [:upper:] / [:lower:] | 대문자 / 소문자 |
| [:space:] | 공백 문자 |
| [:punct:] | 구두점 |
함수
| 함수 | 돌려주는 것 | 예와 결과 |
|---|---|---|
| REGEXP_LIKE(s, p) | 맞으면 참 (WHERE 조건으로) | REGEXP_LIKE(phone, '^010') |
| REGEXP_REPLACE(s, p, r) | 맞는 부분을 r로 바꾼 문자열 | REGEXP_REPLACE('a1b2', '[0-9]', '') → ab |
| REGEXP_SUBSTR(s, p, 시작, n번째) | n번째로 맞는 부분 | REGEXP_SUBSTR('kim@test.com', '[^@]+', 1, 2) → test.com |
| REGEXP_INSTR(s, p) | 맞는 부분의 시작 위치 (없으면 0) | REGEXP_INSTR('abc123', '[0-9]') → 4 |
| REGEXP_COUNT(s, p) | 맞는 횟수 | REGEXP_COUNT('banana', 'a') → 3 |
옵션 (마지막 인수)
'i' 대소문자 무시, 'c' 대소문자 구분(기본), 'n' 마침표가 줄바꿈도 매칭, 'm' 여러 줄 모드. 예: REGEXP_LIKE(name, '^k', 'i') → Kim, kim 모두.
시험에 이렇게 나와요
- 메타문자 의미(. * + ? ^ $ [] [^] {n,m} |)와 패턴에 맞는 문자열 고르기
- REGEXP_SUBSTR·REGEXP_REPLACE·REGEXP_INSTR·REGEXP_COUNT 결과값 계산
- POSIX 클래스 [:digit:] [:alpha:] 등
- LIKE와 정규 표현식 비교
출제 범위·공식 안내 기반 (2024 신설)
확인 문제
Q1. 정규 표현식 '^[0-9]{3}-[0-9]{4}-[0-9]{4}$'에 맞는 문자열은?
- a010-1234-5678
- 010-1234-5678
- 01012345678
- 010-123-5678
정답 보기
2번 010-1234-5678
^는 시작, $는 끝, [0-9]{3}는 숫자 정확히 3개다. 숫자 3개-4개-4개가 처음부터 끝까지 이어진 것만 맞는다.
Q2. REGEXP_SUBSTR('2026-11-14', '[0-9]+', 1, 2)의 결과는?
- NULL
- 14
- 11
- 2026
정답 보기
3번 11
숫자 덩어리 중 두 번째 → 11.
Q3. REGEXP_COUNT('a1b22c333', '[0-9]+')의 결과는?
- 1
- 3
- 6
- 9
정답 보기
2번 3
숫자 1개 이상 덩어리: 1, 22, 333 → 3번.
Q4. 패턴 '^ab*c$'에 맞지 않는 것은?
- abbbc
- abcd
- ac
- abc
정답 보기
2번 abcd
b*는 b가 0번 이상. $로 c에서 끝나야 하므로 abcd는 안 된다.
Q5. LIKE 'K%'와 같은 뜻의 정규 표현식 조건은?
- REGEXP_LIKE(s, '^K')
- REGEXP_LIKE(s, 'K')
- REGEXP_LIKE(s, 'K*')
- REGEXP_LIKE(s, 'K$')
정답 보기
1번 REGEXP_LIKE(s, '^K')
^K는 K로 시작. 'K'만 쓰면 어디든 K가 있으면 맞는다.
헷갈리기 쉬운 O·X
정규 표현식의 *는 '아무 글자 여러 개'를 뜻한다.
정답 보기
X *는 앞 글자의 0번 이상 반복이다. 아무 글자 여러 개는 .*.
REGEXP_LIKE는 SELECT 절이 아니라 WHERE 같은 조건 자리에 쓰는 함수다.
정답 보기
O 참·거짓을 돌려주는 조건 함수다.
[^0-9]는 숫자로 시작하는 문자열을 뜻한다.
정답 보기
X 대괄호 안의 ^는 '제외'. 숫자가 아닌 한 글자다. 시작을 뜻하는 ^는 대괄호 밖.