λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
IT자격증 곡뢀/SQLD 이둠

[SQLD] μ •κ·œν‘œν˜„μ‹ μ•Œμ•„λ³΄κΈ° (+기좜문제)

by yunamom 2025. 7. 28.
728x90
λ°˜μ‘ν˜•

μ•ˆλ…•ν•˜μ„Έμš” yunamom μž…λ‹ˆλ‹€. ^^

μ˜€λŠ˜μ€ SQLD 2κ³Όλͺ© μ •κ·œν‘œν˜„μ‹(Regular Expression) 에 λŒ€ν•˜μ—¬ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

1. μ •κ·œν‘œν˜„μ‹ μ΄λž€?

2. μ •κ·œν‘œν˜„μ‹ ν•¨μˆ˜ 및 기호 정리

3. μ΅œμ‹  기좜문제


1. μ •κ·œν‘œν˜„μ‹ μ΄λž€?

μ •κ·œν‘œν˜„μ‹(Regular Expression)은 λ¬Έμžμ—΄μ˜ νŒ¨ν„΄μ„ μ •μ˜ν•˜κ³  κ²€μƒ‰ν•˜κ±°λ‚˜ μΉ˜ν™˜ν•  수 μžˆλŠ” ν‘œν˜„μ‹ μž…λ‹ˆλ‹€.

κ·Έλ ‡λ‹€λ©΄ μ •κ·œν‘œν˜„μ‹μ€ μ–΄λ– ν•œ μƒν™©μ—μ„œ μ‚¬μš©λ κΉŒμš”?

λ°”λ‘œ λ‹€μŒκ³Ό 같은 κ²½μš°μ— μœ μš©ν•˜κ²Œ μ‚¬μš©λ©λ‹ˆλ‹€. ^^

  • νŠΉμ • 문자 λ˜λŠ” λ¬Έμžμ—΄μ΄ ν¬ν•¨λ˜μ—ˆλŠ”μ§€ 검사할 λ•Œ
  • λ¬Έμžμ—΄μ—μ„œ νŠΉμ • νŒ¨ν„΄λ§Œ μΆ”μΆœν•˜κ±°λ‚˜ λ³€κ²½ν•΄μ•Ό ν•  λ•Œ
  • μ „ν™” 번호, 이메일, 아이디 λ“±κ³Ό 같이 μ •ν•΄μ§„ ν˜•μ‹μ„ 검증할 λ•Œ

2. μ •κ·œν‘œν˜„μ‹ ν•¨μˆ˜, 기호 정리

ν•¨μˆ˜λͺ…  μ„€λͺ… μ˜ˆμ‹œ (Oracle κΈ°μ€€)
REGEXP_COUNT λ¬Έμžμ—΄ λ‚΄μ—μ„œ νŒ¨ν„΄μ΄ λͺ‡ 번 λ‚˜μ˜€λŠ”μ§€ 개수 λ°˜ν™˜ REGEXP_COUNT('a1b2c3', '[0-9]') → 3 (숫자 3개)
REGEXP_LIKE μ‘°κ±΄μ ˆμ—μ„œ λ¬Έμžμ—΄μ΄ νŒ¨ν„΄κ³Ό μΌμΉ˜ν•˜λŠ”μ§€ TRUE/FALSE λ°˜ν™˜ WHERE REGEXP_LIKE(name, '^A') → 이름이 A둜 μ‹œμž‘ν•˜λ©΄ μ°Έ
REGEXP_REPLACE λ¬Έμžμ—΄μ—μ„œ μΌμΉ˜ν•˜λŠ” νŒ¨ν„΄μ„ λ‹€λ₯Έ λ¬Έμžμ—΄λ‘œ μΉ˜ν™˜ REGEXP_REPLACE('010-1234-5678', '[^0-9]', '') → '01012345678'
REGEXP_INSTR λ¬Έμžμ—΄ λ‚΄μ—μ„œ νŒ¨ν„΄μ΄ μ‹œμž‘λ˜λŠ” μœ„μΉ˜(숫자) λ°˜ν™˜ REGEXP_INSTR('abc123', '[0-9]+') → 4(숫자 μ‹œμž‘ μœ„μΉ˜)
REGEXP_SUBSTR λ¬Έμžμ—΄μ—μ„œ νŒ¨ν„΄κ³Ό μΌμΉ˜ν•˜λŠ” 뢀뢄을 μΆ”μΆœ REGEXP_SUBSTR('abc123', '[0-9]+') → '123'
기호 의미 μ˜ˆμ‹œ
β‚© 메타 문자λ₯Ό κ·ΈλŒ€λ‘œ μ‚¬μš©ν•˜κ±°λ‚˜ 특수문자λ₯Ό ν‘œν˜„ν•  λ•Œ μ‚¬μš© β‚©β‚© → \
β‚©n → μ€„λ°”κΏˆ 문자 (newline)

^ λ¬Έμžμ—΄μ˜ μ‹œμž‘ μœ„μΉ˜λ₯Ό μ§€μ • ^abc → abc 둜 μ‹œμž‘ν•˜λŠ” λ¬Έμžμ—΄
$ λ¬Έμžμ—΄μ˜ 끝 μœ„μΉ˜λ₯Ό μ§€μ • abc$ → abc 둜 λλ‚˜λŠ” λ¬Έμžμ—΄
. μž„μ˜μ˜ ν•œ 문자 a.c → abc, acc κ°€λŠ₯
* 0회 이상 반볡 a* → '', 'a', 'aaaa'
+ 1회 이상 반볡 a+ → 'a', 'aaa'
? 0회 λ˜λŠ” 1회 반볡 a? → '', 'a'
{m, } m회 이상 방볡 a{2, } → 'aa', 'aaa'
[ ] 문자 μ§‘ν•© [abc] → a, b, c 쀑 ν•˜λ‚˜
[^ ] κ΄„ν˜Έ μ•ˆμ— μ—†λŠ” 문자 (λΆ€μ • 문자 μ§‘ν•©) [^0-9] → 숫자 μ œμ™Έ
( ) κ·Έλ£Ή μ§€μ • (abc)+
-- REGEXP_LIKE: 'A'둜 μ‹œμž‘ν•˜λŠ” 이름인지 검사
SELECT REGEXP_LIKE('Apple', '^A') AS like_result FROM dual;
-- κ²°κ³Ό: TRUE

-- REGEXP_SUBSTR: b+ 에 ν•΄λ‹Ήν•˜λŠ” 첫 번째 일치 λ¬Έμžμ—΄ μΆ”μΆœ
SELECT REGEXP_SUBSTR('aaabbbccc', 'b+', 1, 1) AS substr_result FROM dual;
-- κ²°κ³Ό: 'bbb'

-- REGEXP_INSTR: 두 번째 숫자 κ·Έλ£Ή([0-9]+)의 μ‹œμž‘ μœ„μΉ˜
SELECT REGEXP_INSTR('abc123abc456', '[0-9]+', 1, 2) AS instr_result FROM dual;
-- κ²°κ³Ό: 10

-- REGEXP_REPLACE: 숫자 μ œμ™Έ 문자 제거 (μ „ν™”λ²ˆν˜Έ 정리)
SELECT REGEXP_REPLACE('010-1234-5678', '[^0-9]', '') AS replace_result FROM dual;
-- κ²°κ³Ό: '01012345678'

-- REGEXP_COUNT: 숫자([0-9])κ°€ λͺ‡ 번 λ‚˜μ˜€λŠ”μ§€ 카운트
SELECT REGEXP_COUNT('a1b2c3', '[0-9]') AS count_result FROM dual;
-- κ²°κ³Ό: 3

3. μ΅œμ‹  기좜문제

 

β–  λ¬Έμ œ1. μ•„λž˜μ˜ SQL 결과둜 μ μ ˆν•œ 것은? [55회 22번]

<SQL> 
SELECT REGEXP_INSTR('12345678', '(123)(4(56)(78))',1, 1, 0, 'i', 2) FROM DUAL;
1) 5

2) 2

3) 6

4) 4

 

β–  λ¬Έμ œ2. ν•¨μˆ˜μ˜ μ‹€ν–‰ 결과둜 μ˜³μ€ 것은? [56회 25번]

<SQL>
SELECT REGEXP_SUBSTR('aaaaabbbb', a{2, 4}) FROM DUAL;
1) aaa

2) aaaa

3) ab

4) aab

 

β–  λ¬Έμ œ3. μ •κ·œν‘œν˜„μ‹ νŒ¨ν„΄ λ§€μΉ­ ν›„, ν•΄λ‹Ή νŒ¨ν„΄μ΄ λ¬Έμžμ—΄ μ•ˆμ—μ„œ 어디에 λ‚˜μ˜€λŠ”μ§€ 'μœ„μΉ˜'λ₯Ό μ •μˆ˜λ‘œ λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜λŠ”? [56회 39번 ]

1) REGEXP_COUNT

2) REGEXP_LIKE

3) REGEXP_REPLACE

4) REGEXP_INSTR

 

β–  λ¬Έμ œ4.  λ‹€μŒ μ •κ·œν‘œν˜„μ‹μ˜ λ‚΄μš© 쀑 μ μ ˆν•œ 것은? [57회 19번]

1) ? : 0회 ν˜Ήμ€ κ·Έ μ΄μƒ λ°˜λ³΅ν•˜λŠ” λŒ€μƒκ³Ό μΌμΉ˜ν•˜λŠ”μ§€ ν™•인

2) * : λŒ€μƒμ΄ 1회 μ΄μƒ λ°˜λ³΅ν•˜λŠ” λŒ€μƒκ³Ό μΌμΉ˜ν•˜λŠ”μ§€ ν™•인

3) +: λŒ€μƒμ΄ 0회 ν˜Ήμ€ κ·Έμ΄μƒλ°˜λ³΅ν•˜λŠ” λŒ€μƒκ³Ό μΌμΉ˜ν•˜λŠ”μ§€ ν™•인

4) {m,}: λŒ€μƒμ΄ 0회 ν˜Ήμ€ κ·Έ 이상 λ°˜λ³΅ν•˜λŠ” λŒ€μƒκ³Ό μΌμΉ˜ν•˜λŠ”μ§€ 확인

 


μ •λ‹΅/ν•΄μ„€

 

β–  1. μ •λ‹΅ : 4

ν•΄μ„€: λ¬Έμžμ—΄ μ•ˆμ—μ„œ μ •κ·œν‘œν˜„μ‹ 을 μ°Ύκ³ , κ·Έ μ€‘μ—μ„œ 두 번째 κ΄„ν˜Έ(κ·Έλ£Ή) κ°€ μ–΄λ””μ„œ μ‹œμž‘λ˜λŠ”μ§€ μœ„μΉ˜(숫자) λ₯Ό λ°˜ν™˜

SELECT REGEXP_INSTR('12345678', '(123)(4(56)(78))', 1, 1, 0, 'i', 2) FROM DUAL;

#REGEXP_INSTR ν•¨μˆ˜μ˜ νŒŒλΌλ―Έν„°μ™€ κ΄„ν˜Έ 그룹의 의미λ₯Ό 이해해야 함
REGEXP_INSTR(λ¬Έμžμ—΄, νŒ¨ν„΄, μ‹œμž‘μœ„μΉ˜, λͺ‡λ²ˆμ§Έμ°ΎκΈ°, 전체orλΆ€λΆ„, μ˜΅μ…˜, 그룹번호)

REGEXP_INSTR(
  source_string,     -- 검색할 λ¬Έμžμ—΄
  pattern,           -- μ •κ·œν‘œν˜„μ‹ νŒ¨ν„΄
  start_position,    -- μ–΄λ””μ„œλΆ€ν„° 검색할지 (κΈ°λ³Έκ°’: 1)
  occurrence,        -- λͺ‡ 번째둜 μΌμΉ˜ν•œ ν•­λͺ©μ„ 찾을지 (κΈ°λ³Έκ°’: 1)
  return_option,     -- 0: νŒ¨ν„΄ μ „μ²΄μ˜ μ‹œμž‘ μœ„μΉ˜, 1: μΌμΉ˜ν•˜λŠ” λΆ€λΆ„ 끝 μœ„μΉ˜ + 1
  match_parameter,   -- 'i', 'c', 'n' λ“± (μ˜΅μ…˜) λŒ€μ†Œλ¬Έμž ꡬ뢄 μ—¬λΆ€ λ“±
  subexpression      -- λͺ‡ 번째 κ΄„ν˜Έ 그룹의 μœ„μΉ˜λ₯Ό λ°˜ν™˜ν• μ§€
)
  • '12345678' : 검색할 λ¬Έμžμ—΄
  • '(123)(4(56)(78))' : μ •κ·œν‘œν˜„μ‹
  • 1 : λ¬Έμžμ—΄μ˜ 첫 κΈ€μžλΆ€ν„° 검색
  • 1 : 첫 번째 일치 ν•­λͺ©
  • 0 : 전체 νŒ¨ν„΄ 쀑 μ‹œμž‘ μœ„μΉ˜ λ°˜ν™˜
  • 'i' : λŒ€μ†Œλ¬Έμž λ¬΄μ‹œ (μ—¬κΈ°μ„  의미 μ—†μŒ)
  • 2 : 두 번째 그룹이 μ‹œμž‘λ˜λŠ” μœ„μΉ˜ λ°˜ν™˜ 
'12345678'

→ 이 λ¬Έμžμ—΄μ—μ„œ νŠΉμ • μ •κ·œν‘œν˜„μ‹ νŒ¨ν„΄μ΄ μ–΄λ””μ„œ μ‹œμž‘ν•˜λŠ”μ§€λ₯Ό μ°ΎλŠ” 문제

(123)(4(56)(78))

μ—¬κΈ°μ—λŠ” κ΄„ν˜Έκ°€ 4개 μžˆμœΌλ‹ˆ 총 4개의 "κ·Έλ£Ή" 이 있음

κ·Έλ£Ή 번호 μ •κ·œ ν‘œν˜„μ‹ νŒ¨ν„΄ λ¬Έμžμ—΄μ—μ„œ μΌμΉ˜ν•˜λŠ” λΆ€λΆ„ μ„€λͺ…
1번 κ·Έλ£Ή (123) '12345678' 쀑 '123' 1~3번째 λ¬Έμžμ™€ 일치
2번 κ·Έλ£Ή (4(56)(78)) '12345678' 쀑 '45678' 4번째 문자 '4' λΆ€ν„° μ‹œμž‘
3번 κ·Έλ£Ή (56) '12345678' 쀑 '56' 5~6번째 문자
4번 κ·Έλ£Ή (78) '12345678' 쀑 '78' 7~8번째 문자

 

β–  2. μ •λ‹΅ : 2

ν•΄μ„€: 'a'κ°€ 2번 이상 4번 μ΄ν•˜ λ°˜λ³΅λ˜λŠ” λΆ€λΆ„μ°ΎκΈ°

SELECT REGEXP_SUBSTR('aaaaabbbb', a{2, 4}) FROM DUAL;

REGEXP_SUBSTR(λ¬Έμžμ—΄, μ •κ·œν‘œν˜„μ‹ [, μœ„μΉ˜, 순번, μ˜΅μ…˜, 그룹번호])

REGEXP_SUBSTR(
  source_string,     -- 검색할 λ¬Έμžμ—΄
  pattern,           -- μ •κ·œν‘œν˜„μ‹ νŒ¨ν„΄
  start_position,    -- μ–΄λ””μ„œλΆ€ν„° 검색할지 (κΈ°λ³Έκ°’: 1)
  occurrence,        -- λͺ‡ 번째둜 μΌμΉ˜ν•œ ν•­λͺ©μ„ κ°€μ Έμ˜¬μ§€ (κΈ°λ³Έκ°’: 1)
  return_option,     -- 0이면 전체, 1이면 맀칭된 μœ„μΉ˜λΆ€ν„°
  subexpression      -- κ΄„ν˜Έ κ·Έλ£Ή 쀑 λͺ‡ 번째 그룹을 λ°˜ν™˜ν• μ§€
)

'aaaaabbbb' : 검색할 λ¬Έμžμ—΄

'a{2,4}' : μ •κ·œν‘œν˜„μ‹ νŒ¨ν„΄ πŸ‘‰ 'a'κ°€ 2번 이상 4번 μ΄ν•˜ λ°˜λ³΅λ˜λŠ” λΆ€λΆ„μ°ΎκΈ° πŸ‘‰ 'aaaa'

 

β–  3. μ •λ‹΅ : 4

ν•΄μ„€: 

COUNT → λͺ‡ 번 λ‚˜μ˜€λŠ”μ§€

LIKE → μΌμΉ˜ν•˜λŠ”μ§€ (TRUE/FALSE)

REPLACE → λ°”κΎΈκΈ°

INSTR → μœ„μΉ˜ λ°˜ν™˜ (μ •μˆ˜)

SUBSTR → λ¬Έμžμ—΄ μΆ”μΆœ (λΆ€λΆ„)

 

β–  4. μ •λ‹΅ : 4

ν•΄μ„€:

μ •κ·œν‘œν˜„μ‹μ—μ„œ μ‚¬μš©λ˜λŠ” λ°˜λ³΅ 기호의 의미

기호 의미 μ˜ˆμ‹œ
? 0회 λ„λŠ” 1회 반볡 a?  ' ' λ˜λŠ” 'a'와 일치
* 0회 이상 λ°˜λ³΅ (0회 포함) a*  '', 'a', 'aaa' λ“±
+ 1회 이상 λ°˜λ³΅ a+  'a', 'aa' λ“±
{m,} m회 이상 반볡 a{3,}  'aaa', 'aaaa' λ“±

 

728x90
300x250

μ½”λ“œ