편집 요약 없음 |
편집 요약 없음 |
||
(같은 사용자의 중간 판 10개는 보이지 않습니다) | |||
1번째 줄: | 1번째 줄: | ||
Oracle 19c에서 사용하는 정규표현식 패턴 | |||
=== 정규표현식 기초 설명 (Oracle 기준) === | |||
정규표현식 기초 | |||
{| class="wikitable" | {| class="wikitable" | ||
! 패턴 !! 의미 !! 쉬운 설명 !! 예시 | ! 패턴 !! 의미 !! 쉬운 설명 !! 예시 | ||
36번째 줄: | 34번째 줄: | ||
|} | |} | ||
=== 예시로 이해하기 === | |||
<source lang=sql> | |||
'^[A-Z][a-z]+$' | |||
예시로 이해하기 | </source> | ||
→ 의미: 첫 글자는 대문자, 그 뒤는 소문자 한 글자 이상, 전체가 한 단어 | → 의미: 첫 글자는 대문자, 그 뒤는 소문자 한 글자 이상, 전체가 한 단어 | ||
* 일치: "John", "David" | |||
* 불일치: "john", "DAVID", "John123" | |||
---- | |||
<source lang=sql> | |||
^[0-9]{3}-[0-9]{4}-[0-9]{4}$ | |||
</source> | |||
→ 의미: 전화번호 형식 (숫자3-숫자4-숫자4) | → 의미: 전화번호 형식 (숫자3-숫자4-숫자4) | ||
* 일치: "010-1234-5678" | |||
* 불일치: "10-1234-5678", "01012345678" | |||
---- | |||
<source lang=sql> | |||
'^\d{6}-\d{7}$' | |||
</source> | |||
→ 의미: 주민등록번호 형식 (6자리-7자리 숫자) | → 의미: 주민등록번호 형식 (6자리-7자리 숫자) | ||
→ \d는 숫자 [0-9]와 같음 | → \d는 숫자 [0-9]와 같음 | ||
* 일치: "990101-1234567" | |||
* 불일치: "9901011234567", "99-0101-1234567" | |||
---- | |||
{| class="wikitable" | {| class="wikitable" | ||
|+ 정규 표현식(Regex) 활용 예제 | |+ 정규 표현식(Regex) 활용 예제 | ||
97번째 줄: | 97번째 줄: | ||
|} | |} | ||
=== 실전예시 === | |||
==== 2. Oracle SQL에서 사용하는 정규표현식 함수 예제 ==== | |||
===== 1. REGEXP_LIKE – 패턴 일치 여부 확인 ===== | |||
1. REGEXP_LIKE – 패턴 일치 여부 확인 | |||
<source lang=sql> | |||
SELECT first_name | SELECT first_name | ||
FROM employees | FROM employees | ||
WHERE REGEXP_LIKE(first_name, '^A'); -- 이름이 A로 시작하는 직원 | WHERE REGEXP_LIKE(first_name, '^A'); -- 이름이 A로 시작하는 직원 | ||
</source> | |||
2. REGEXP_SUBSTR – 패턴에 맞는 부분 문자열 추출 | ===== 2. REGEXP_SUBSTR – 패턴에 맞는 부분 문자열 추출 ===== | ||
<source lang=sql> | |||
SELECT REGEXP_SUBSTR('john.doe@example.com', '[a-z0-9._%+-]+') AS local_part | SELECT REGEXP_SUBSTR('john.doe@example.com', '[a-z0-9._%+-]+') AS local_part | ||
FROM dual; | FROM dual; | ||
-- 결과: 'john.doe' | -- 결과: 'john.doe' | ||
</source> | |||
3. REGEXP_INSTR – 패턴 위치 찾기 | ===== 3. REGEXP_INSTR – 패턴 위치 찾기 ===== | ||
<source lang=sql> | |||
SELECT REGEXP_INSTR('employee123data', '[0-9]+') AS number_pos | SELECT REGEXP_INSTR('employee123data', '[0-9]+') AS number_pos | ||
FROM dual; | FROM dual; | ||
-- 결과: 9 (숫자가 처음 나오는 위치) | -- 결과: 9 (숫자가 처음 나오는 위치) | ||
</source> | |||
4. REGEXP_REPLACE – 패턴에 맞는 문자열 치환 | ===== 4. REGEXP_REPLACE – 패턴에 맞는 문자열 치환 ===== | ||
<source lang=sql> | |||
SELECT REGEXP_REPLACE('abc123xyz', '[0-9]', '') AS removed_digits'' | SELECT REGEXP_REPLACE('abc123xyz', '[0-9]', '') AS removed_digits'' | ||
FROM dual; | FROM dual; | ||
-- 결과: 'abcxyz' (숫자 제거) | -- 결과: 'abcxyz' (숫자 제거) | ||
</source> | |||
===== 5. 전화번호 형식 확인 ===== | |||
<source lang=sql> | |||
SELECT phone_number | SELECT phone_number | ||
FROM customers | FROM customers | ||
WHERE REGEXP_LIKE(phone_number, '^\d{3}-\d{3,4}-\d{4}$'); | WHERE REGEXP_LIKE(phone_number, '^\d{3}-\d{3,4}-\d{4}$'); | ||
-- 예: '010-1234-5678' 형식만 조회 | -- 예: '010-1234-5678' 형식만 조회 | ||
</source> | |||
=== 실무에 유용한 정규식 활용법 === | |||
==== 1. 이메일 주소 유효성 검사==== | |||
<source lang=sql> | |||
SELECT email | SELECT email | ||
FROM users | FROM users | ||
WHERE REGEXP_LIKE(email, '^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$', 'i'); | WHERE REGEXP_LIKE(email, '^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$', 'i'); | ||
</source> | |||
* 설명: @ 앞뒤 형식을 체크하고, 대소문자 구분 없이 검사 ('i' 플래그) | |||
* 일치: user123@gmail.com, test.name@domain.co.kr | |||
==== 2. 주민등록번호 유효성 패턴 확인 ==== | |||
<source lang=sql> | |||
SELECT ssn | SELECT ssn | ||
FROM people | FROM people | ||
WHERE REGEXP_LIKE(ssn, '^\d{6}-\d{7}$'); | WHERE REGEXP_LIKE(ssn, '^\d{6}-\d{7}$'); | ||
</source> | |||
* 설명: 주민번호 형식 ######-####### 검사 | |||
* 일치: 990101-1234567 | |||
==== 3. 주민등록번호 마스킹 처리 (정규식 + 치환) ==== | |||
<source lang=sql> | |||
SELECT REGEXP_REPLACE(ssn, '(\d{6})-(\d{7})', '\1-*******') AS masked_ssn | SELECT REGEXP_REPLACE(ssn, '(\d{6})-(\d{7})', '\1-*******') AS masked_ssn | ||
FROM people; | FROM people; | ||
</source> | |||
* 결과: 990101-******* | |||
==== 4. 문자열에서 숫자만 추출 ==== | |||
<source lang=sql> | |||
SELECT REGEXP_SUBSTR('abc123def456', '\d+') AS first_number | SELECT REGEXP_SUBSTR('abc123def456', '\d+') AS first_number | ||
FROM dual; | FROM dual; | ||
</source> | |||
* 결과: 123 (첫 번째 숫자 그룹 추출) | |||
==== 5. 특정 패턴이 포함된 문자열만 추출 (예: http 또는 https로 시작하는 URL) ==== | |||
<source lang=sql> | |||
SELECT REGEXP_SUBSTR('Visit https://example.com now', 'https?://[^\s]+') AS url | SELECT REGEXP_SUBSTR('Visit https://example.com now', 'https?://[^\s]+') AS url | ||
FROM dual; | FROM dual; | ||
</source> | |||
* 결과: https://example.com | |||
==== 6. 정규표현식으로 공백/특수문자 제거 ==== | |||
<source lang=sql> | |||
SELECT REGEXP_REPLACE('hello! @world#2024', '[^a-zA-Z0-9]', '') AS clean_string'' | SELECT REGEXP_REPLACE('hello! @world#2024', '[^a-zA-Z0-9]', '') AS clean_string'' | ||
FROM dual; | FROM dual; | ||
</source> | |||
* 결과: helloworld2024 | |||
==== 7. 특정 문자로 시작하거나 끝나는 문자열 필터링 ==== | |||
<source lang=sql> | |||
-- 이름이 'K'로 시작하는 경우 | -- 이름이 'K'로 시작하는 경우 | ||
SELECT name FROM employees WHERE REGEXP_LIKE(name, '^K'); | SELECT name FROM employees WHERE REGEXP_LIKE(name, '^K'); | ||
242번째 줄: | 208번째 줄: | ||
-- 이름이 'y'로 끝나는 경우 | -- 이름이 'y'로 끝나는 경우 | ||
SELECT name FROM employees WHERE REGEXP_LIKE(name, 'y$'); | SELECT name FROM employees WHERE REGEXP_LIKE(name, 'y$'); | ||
</source> | |||
[[category:oracle]] | |||
[[category:oracle]] | |||
2025년 5월 22일 (목) 21:41 기준 최신판
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" | |
\ | 이스케이프 문자 | 특수기호를 문자로 인식 | \. → 점(.) 자체
|
예시로 이해하기
'^[A-Z][a-z]+$'
→ 의미: 첫 글자는 대문자, 그 뒤는 소문자 한 글자 이상, 전체가 한 단어
- 일치: "John", "David"
- 불일치: "john", "DAVID", "John123"
^[0-9]{3}-[0-9]{4}-[0-9]{4}$
→ 의미: 전화번호 형식 (숫자3-숫자4-숫자4)
- 일치: "010-1234-5678"
- 불일치: "10-1234-5678", "01012345678"
'^\d{6}-\d{7}$'
→ 의미: 주민등록번호 형식 (6자리-7자리 숫자) → \d는 숫자 [0-9]와 같음
- 일치: "990101-1234567"
- 불일치: "9901011234567", "99-0101-1234567"
사용 목적 | 정규식 예시 | 설명 |
---|---|---|
이메일 검증 | ^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$
|
|
전화번호 확인 | ^\d{3}-\d{3,4}-\d{4}$
|
|
숫자만 추출 | \d+
|
|
특정 문자 제거 | REGEXP_REPLACE(col, '[^0-9]', )
|
|
실전예시
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' 형식만 조회
실무에 유용한 정규식 활용법
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;
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$');