메뉴 여닫기
개인 메뉴 토글
로그인하지 않음
만약 지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
편집 요약 없음
편집 요약 없음
 
(같은 사용자의 중간 판 9개는 보이지 않습니다)
1번째 줄: 1번째 줄:
Oracle 19c에서 사용하는 정규표현식 패턴
Oracle 19c에서 사용하는 정규표현식 패턴


=== 정규표현식 기초 패턴 설명 (Oracle 기준) ===
=== 정규표현식 기초 설명 (Oracle 기준) ===
{| class="wikitable"
{| class="wikitable"
! 패턴 !! 의미 !! 쉬운 설명 !! 예시
! 패턴 !! 의미 !! 쉬운 설명 !! 예시
35번째 줄: 35번째 줄:


=== 예시로 이해하기 ===
=== 예시로 이해하기 ===
1. '^[A-Z][a-z]+$'
<source lang=sql>
'^[A-Z][a-z]+$'
</source>


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


----


2. ^[0-9]{3}-[0-9]{4}-[0-9]{4}$
<source lang=sql>
^[0-9]{3}-[0-9]{4}-[0-9]{4}$
</source>


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


----


3. '^\d{6}-\d{7}$'
<source lang=sql>
'^\d{6}-\d{7}$'
</source>


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


----
{| class="wikitable"
{| class="wikitable"
|+ 정규 표현식(Regex) 활용 예제
|+ 정규 표현식(Regex) 활용 예제
92번째 줄: 98번째 줄:


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


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


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


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>


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


==== 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' 플래그)
* 설명: @ 앞뒤 형식을 체크하고, 대소문자 구분 없이 검사 ('i' 플래그)
일치: user123@gmail.com, test.name@domain.co.kr
* 일치: user123@gmail.com, test.name@domain.co.kr
 


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


==== 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
* 일치: 990101-1234567
 


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


==== 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-*******
* 결과: 990101-*******
 


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


==== 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 (첫 번째 숫자 그룹 추출)
* 결과: 123 (첫 번째 숫자 그룹 추출)
 


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


==== 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
* 결과: https://example.com
 


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


==== 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
* 결과: helloworld2024
 


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


==== 7. 특정 문자로 시작하거나 끝나는 문자열 필터링 ====
<source lang=sql>
-- 이름이 'K'로 시작하는 경우
-- 이름이 'K'로 시작하는 경우
SELECT name FROM employees WHERE REGEXP_LIKE(name, '^K');
SELECT name FROM employees WHERE REGEXP_LIKE(name, '^K');
236번째 줄: 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"

정규 표현식(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]: 숫자가 아닌 모든 문자
  • 숫자를 제외한 모든 문자를 공백으로 치환

실전예시

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$');