메뉴 여닫기
개인 메뉴 토글
로그인하지 않음
만약 지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
Oracle (토론 | 기여)님의 2025년 5월 13일 (화) 23:26 판

좋아요! 정규표현식을 처음 배우는 분도 이해할 수 있도록, Oracle 19c에서 사용하는 정규표현식 패턴을 쉬운 설명 + 예시 중심으로 하나씩 자세히 설명드릴게요.

정규표현식 기초 패턴 설명 (Oracle 기준)

패턴 의미 쉬운 설명 예시
. 임의의 한 글자 어떤 글자든 한 글자만 a.c → "abc", "axc"
* 0회 이상 반복 없어도 되고, 많아도 됨 a* → "", "a", "aa", "aaa"
+ 1회 이상 반복 적어도 한 번은 나와야 함 a+ → "a", "aa", "aaa"
? 0회 또는 1회 있을 수도, 없을 수도 있음 ab? → "a", "ab"
^ 문자열의 시작 맨 앞에서 시작해야 함 ^a → "apple"에는 일치, "banana"에는 불일치
$ 문자열의 끝 맨 끝에서 끝나야 함 ing$ → "playing", "going"
[abc] 괄호 안 문자 중 하나 a, b, c 중 하나와 일치 [abc] → "a", "b", "c"
[^abc] 괄호 안 문자 제외 a, b, c를 제외한 문자와 일치 [^abc] → "d", "x"
[a-z] 알파벳 범위 a부터 z 중 하나 [A-Z] → 대문자, [0-9] → 숫자
{n} 정확히 n번 반복 정확히 n번 반복됨 a{3} → "aaa"
{n,} n번 이상 반복 n번 이상 반복됨 a{2,} → "aa", "aaa", ...
{n,m} n~m회 반복 n 이상 m 이하 반복 a{2,4} → "aa", "aaa", "aaaa"
또는(OR) 둘 중 하나 dog → "cat", "dog"
\ 이스케이프 문자 특수기호를 문자로 인식 \. → 점(.) 자체


예시로 이해하기

1. '^[A-Z][a-z]+$'

→ 의미: 첫 글자는 대문자, 그 뒤는 소문자 한 글자 이상, 전체가 한 단어 • 일치: "John", "David" • 불일치: "john", "DAVID", "John123"

2. ^[0-9]{3}-[0-9]{4}-[0-9]{4}$

→ 의미: 전화번호 형식 (숫자3-숫자4-숫자4) • 일치: "010-1234-5678" • 불일치: "10-1234-5678", "01012345678"

3. '^\d{6}-\d{7}$'

→ 의미: 주민등록번호 형식 (6자리-7자리 숫자) → \d는 숫자 [0-9]와 같음 • 일치: "990101-1234567" • 불일치: "9901011234567", "99-0101-1234567"

정규 표현식(Regex) 활용 예제
사용 목적 정규식 예시 설명
이메일 검증 ^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$
  • 영문 소문자/숫자/특수문자(. _ % + -) 조합
  • @ 뒤에 도메인명과 최소 2자리 이상의 도메인 확장자
전화번호 확인 ^\d{3}-\d{3,4}-\d{4}$
  • 000-0000-0000 또는 000-000-0000 형식
  • \d는 숫자([0-9]와 동일)
숫자만 추출 \d+
  • 문자열에서 연속된 숫자만 매칭
  • "+"는 1회 이상 반복 의미
특정 문자 제거 REGEXP_REPLACE(col, '[^0-9]', )
  • [^0-9]: 숫자가 아닌 모든 문자
  • 숫자를 제외한 모든 문자를 공백으로 치환

실전예시

좋습니다! 요청하신 내용을 두 부분으로 나눠 정리해드릴게요:

1. 정규표현식 기초 패턴 미디어위키 표

패턴 의미 쉬운 설명 예시
. 임의의 한 글자 어떤 글자든 한 글자만 a.c → "abc", "axc"
* 0회 이상 반복 없어도 되고, 많아도 됨 a* → "", "a", "aa", "aaa"
+ 1회 이상 반복 적어도 한 번은 나와야 함 a+ → "a", "aa", "aaa"
? 0회 또는 1회 있을 수도, 없을 수도 있음 ab? → "a", "ab"
^ 문자열의 시작 맨 앞에서 시작해야 함 ^a → "apple"에는 일치, "banana"에는 불일치
$ 문자열의 끝 맨 끝에서 끝나야 함 ing$ → "playing", "going"
[abc] 괄호 안 문자 중 하나 a, b, c 중 하나와 일치 [abc] → "a", "b", "c"
[^abc] 괄호 안 문자 제외 a, b, c를 제외한 문자와 일치 [^abc] → "d", "x"
[a-z] 알파벳 범위 a부터 z 중 하나 [A-Z] → 대문자, [0-9] → 숫자
{n} 정확히 n번 반복 정확히 n번 반복됨 a{3} → "aaa"
{n,} n번 이상 반복 n번 이상 반복됨 a{2,} → "aa", "aaa", ...
{n,m} n~m회 반복 n 이상 m 이하 반복 a{2,4} → "aa", "aaa", "aaaa"
또는(OR) 둘 중 하나 dog → "cat", "dog"
\ 이스케이프 문자 특수기호를 문자로 인식 \. → 점(.) 자체


2. Oracle SQL에서 사용하는 정규표현식 함수 예제

1. REGEXP_LIKE – 패턴 일치 여부 확인

SELECT first_name FROM employees WHERE REGEXP_LIKE(first_name, '^A'); -- 이름이 A로 시작하는 직원

2. REGEXP_SUBSTR – 패턴에 맞는 부분 문자열 추출

SELECT REGEXP_SUBSTR('john.doe@example.com', '[a-z0-9._%+-]+') AS local_part FROM dual; -- 결과: 'john.doe'

3. REGEXP_INSTR – 패턴 위치 찾기

SELECT REGEXP_INSTR('employee123data', '[0-9]+') AS number_pos FROM dual; -- 결과: 9 (숫자가 처음 나오는 위치)

4. REGEXP_REPLACE – 패턴에 맞는 문자열 치환

SELECT REGEXP_REPLACE('abc123xyz', '[0-9]', ) AS removed_digits FROM dual; -- 결과: 'abcxyz' (숫자 제거)

5. 전화번호 형식 확인

SELECT phone_number FROM customers WHERE REGEXP_LIKE(phone_number, '^\d{3}-\d{3,4}-\d{4}$'); -- 예: '010-1234-5678' 형식만 조회

좋아요! 그러면 이어서 정규표현식을 활용한 실전 예제를 아래처럼 분류해서 설명드릴게요. 아래 예제는 Oracle 19c SQL 환경에서 실무에 유용한 정규식 활용법입니다.

1. 이메일 주소 유효성 검사

SELECT email FROM users WHERE REGEXP_LIKE(email, '^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$', 'i');

• 설명: @ 앞뒤 형식을 체크하고, 대소문자 구분 없이 검사 ('i' 플래그) • 일치: user123@gmail.com, test.name@domain.co.kr

2. 주민등록번호 유효성 패턴 확인

SELECT ssn FROM people WHERE REGEXP_LIKE(ssn, '^\d{6}-\d{7}$');

• 설명: 주민번호 형식 ######-####### 검사 • 일치: 990101-1234567

3. 주민등록번호 마스킹 처리 (정규식 + 치환)

SELECT REGEXP_REPLACE(ssn, '(\d{6})-(\d{7})', '\1-*******') AS masked_ssn FROM people;

• 결과: 990101-*******

4. 문자열에서 숫자만 추출

SELECT REGEXP_SUBSTR('abc123def456', '\d+') AS first_number FROM dual;

• 결과: 123 (첫 번째 숫자 그룹 추출)

5. 특정 패턴이 포함된 문자열만 추출 (예: http 또는 https로 시작하는 URL)

SELECT REGEXP_SUBSTR('Visit https://example.com now', 'https?://[^\s]+') AS url FROM dual;

• 결과: https://example.com

6. 정규표현식으로 공백/특수문자 제거

SELECT REGEXP_REPLACE('hello! @world#2024', '[^a-zA-Z0-9]', ) AS clean_string FROM dual;

• 결과: helloworld2024

7. 특정 문자로 시작하거나 끝나는 문자열 필터링

-- 이름이 'K'로 시작하는 경우 SELECT name FROM employees WHERE REGEXP_LIKE(name, '^K');

-- 이름이 'y'로 끝나는 경우 SELECT name FROM employees WHERE REGEXP_LIKE(name, 'y$');