μλ νμΈμ 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' λ± |
'ITμκ²©μ¦ κ³΅λΆ > SQLD μ΄λ‘ ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
| [SQLD] PIVOT, UNPIVOT μ΄λ 무μμΈκ°? (+κΈ°μΆμμλ¬Έμ ) (1) | 2025.07.24 |
|---|---|
| [SQLD] λΆμ λΉκ΅μ°μ°μ <> (λ¬Έμ νμ΄/ν΄μ€) (0) | 2022.05.16 |
| [SQL μ λ¬Έκ°] κ³Όλͺ©II. μ 3μ₯ κ΄λ¦¬ ꡬ문 - μ°μ΅λ¬Έμ (μ΄ 7λ¬Έμ ) (1) | 2022.04.22 |
| [SQL μ λ¬Έκ°] κ³Όλͺ©II. μ 3μ₯ κ΄λ¦¬ ꡬ문 (0) | 2022.04.21 |
| [SQL μ λ¬Έκ°] κ³Όλͺ©II. μ 2μ₯ SQL νμ© - μ°μ΅λ¬Έμ (2) | 2022.04.15 |